123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- """
- Neo IO module for optical imaging data stored as a folder of TIFF images.
- """
- import os
- try:
- from PIL import Image
- have_pil = True
- except ImportError:
- have_pil = False
- import numpy as np
- from neo.core import ImageSequence, Segment, Block
- from .baseio import BaseIO
- import glob
- import re
- class TiffIO(BaseIO):
- """
- Neo IO module for optical imaging data stored as a folder of TIFF images.
- *Usage*:
- >>> from neo import io
- >>> import quantities as pq
- >>> r = io.TiffIO("dir_tiff",spatial_scale=1.0*pq.mm, units='V',
- ... sampling_rate=1.0*pq.Hz)
- >>> block = r.read_block()
- read block
- creating segment
- returning block
- >>> block
- Block with 1 segments
- file_origin: 'test'
- # segments (N=1)
- 0: Segment with 1 imagesequences
- annotations: {'tiff_file_names': ['file_tif_1_.tiff',
- 'file_tif_2.tiff',
- 'file_tif_3.tiff',
- 'file_tif_4.tiff',
- 'file_tif_5.tiff',
- 'file_tif_6.tiff',
- 'file_tif_7.tiff',
- 'file_tif_8.tiff',
- 'file_tif_9.tiff',
- 'file_tif_10.tiff',
- 'file_tif_11.tiff',
- 'file_tif_12.tiff',
- 'file_tif_13.tiff',
- 'file_tif_14.tiff']}
- # analogsignals (N=0)
- """
- name = 'TIFF IO'
- description = "Neo IO module for optical imaging data stored as a folder of TIFF images."
- _prefered_signal_group_mode = 'group-by-same-units'
- is_readable = True
- is_writable = False
- supported_objects = [Block, Segment, ImageSequence]
- readable_objects = supported_objects
- writeable_objects = []
- support_lazy = False
- read_params = {}
- write_params = {}
- extensions = []
- mode = 'dir'
- def __init__(self, directory_path=None, units=None, sampling_rate=None,
- spatial_scale=None, **kwargs):
- if not have_pil:
- raise Exception("Please install the pillow package to use TiffIO")
- BaseIO.__init__(self, directory_path, **kwargs)
- self.units = units
- self.sampling_rate = sampling_rate
- self.spatial_scale = spatial_scale
- def read_block(self, lazy=False, **kwargs):
- # to sort file
- def natural_sort(l):
- convert = lambda text: int(text) if text.isdigit() else text.lower()
- alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)]
- return sorted(l, key=alphanum_key)
- # find all the images in the given directory
- file_name_list = []
- # name of extensions to track
- types = ["*.tif", "*.tiff"]
- for file in types:
- file_name_list.append(glob.glob(self.filename+"/"+file))
- # flatten list
- file_name_list = [item for sublist in file_name_list for item in sublist]
- # delete path in the name of file
- file_name_list = [file_name[len(self.filename)+1::] for file_name in file_name_list]
- # sorting file
- file_name_list = natural_sort(file_name_list)
- list_data_image = []
- for file_name in file_name_list:
- list_data_image.append(
- np.array(Image.open(self.filename + "/" + file_name), dtype=np.float))
- list_data_image = np.array(list_data_image)
- if len(list_data_image.shape) == 4:
- list_data_image = []
- for file_name in file_name_list:
- list_data_image.append(
- np.array(Image.open(self.filename + "/" + file_name).convert('L'), dtype=np.float))
- print("read block")
- image_sequence = ImageSequence(np.stack(list_data_image),
- units=self.units,
- sampling_rate=self.sampling_rate,
- spatial_scale=self.spatial_scale)
- print("creating segment")
- segment = Segment(file_origin=self.filename)
- segment.annotate(tiff_file_names=file_name_list)
- segment.imagesequences = [image_sequence]
- block = Block(file_origin=self.filename)
- segment.block = block
- block.segments.append(segment)
- print("returning block")
- return block
|