将带有 skimage 的非 RGBA 4-tile 多页 tiff 图像加载到 dask 数组中
Loading non RGBA 4-tile multi page tiff images with skimage into dask array
我需要阅读一个包含由 Suite2p 神经生物学包生成的多页 tiff 的文件夹。
从 Suite2p 源代码中,多重 tiff 创建如下:
import numpy as np
from tifffile import TiffWriter
# fake example images
img_5_tiles = np.random.randint(0,65535,(5,10,20), dtype='uint16')
img_4_tiles = img_5_tiles[1:,...]
# save fake images
with TiffWriter(r'D:tiles.tiff') as tif:
for frame in img_5_tiles:
tif.save(frame)
with TiffWriter(r'D:tiles.tiff') as tif:
for frame in img_4_tiles:
tif.save(frame)
当我尝试将它们读入 dask 时,skimage.io 默认的 tifffile 插件无法获得正确的形状:
from dask.array.image import imread
from skimage import io
def read_with_tifffile(path):
return io.imread(path, plugin='tifffile')
# should produce (5,10,20) instead of (1,10,20)
imread(r'D:tiles.tiff', imread=read_with_tifffile).shape
我可以通过使用非默认 skimage.io.imread 插件 'pil'
来克服这个问题
def read_with_pil(path):
return io.imread(path, plugin='pil', mode='L')
# gives (1,5,10,20) which is acceptable
imread(r'D:tiles.tiff', imread=read_with_pil).shape
不幸的是,如果图块数等于 4,skimage 开始以不同方式处理形状:
# gives (1,10,20,4) instead of (1,4,10,20)
imread(r'D:tiles.tiff', imread=read_with_pil).shape
通过阅读 skimage 文档,它可能试图将我的图像解释为 RGBA,然后失败了。
是否有强制 'uint16' 多页读取所有图像形状的解决方案?
如有任何建议,我们将不胜感激!
基于cgohlke的评论:
from dask.array.image import imread
import numpy as np
from skimage import io
import tifffile
# fake data
img_with_4_tiles = np.random.randint(0,65535,(4,10,20), dtype='uint16')
with tifffile.TiffWriter(r'D:tiles.tiff') as tif:
for frame in img_with_4_tiles:
tif.save(frame)
# my original bad solution
def read_with_pil(path):
return io.imread(path, plugin='pil', mode='L')
print(imread(r'D:tiles.tiff', imread=read_with_pil).shape)
# a good solution from the horse's mouth (https://pypi.org/user/cgohlke/)
def read_with_tifffile(path):
return tifffile.imread(path, is_shaped=False)
print(imread(r'D:tiles.tiff', imread=read_with_tifffile).shape)
我需要阅读一个包含由 Suite2p 神经生物学包生成的多页 tiff 的文件夹。 从 Suite2p 源代码中,多重 tiff 创建如下:
import numpy as np
from tifffile import TiffWriter
# fake example images
img_5_tiles = np.random.randint(0,65535,(5,10,20), dtype='uint16')
img_4_tiles = img_5_tiles[1:,...]
# save fake images
with TiffWriter(r'D:tiles.tiff') as tif:
for frame in img_5_tiles:
tif.save(frame)
with TiffWriter(r'D:tiles.tiff') as tif:
for frame in img_4_tiles:
tif.save(frame)
当我尝试将它们读入 dask 时,skimage.io 默认的 tifffile 插件无法获得正确的形状:
from dask.array.image import imread
from skimage import io
def read_with_tifffile(path):
return io.imread(path, plugin='tifffile')
# should produce (5,10,20) instead of (1,10,20)
imread(r'D:tiles.tiff', imread=read_with_tifffile).shape
我可以通过使用非默认 skimage.io.imread 插件 'pil'
来克服这个问题def read_with_pil(path):
return io.imread(path, plugin='pil', mode='L')
# gives (1,5,10,20) which is acceptable
imread(r'D:tiles.tiff', imread=read_with_pil).shape
不幸的是,如果图块数等于 4,skimage 开始以不同方式处理形状:
# gives (1,10,20,4) instead of (1,4,10,20)
imread(r'D:tiles.tiff', imread=read_with_pil).shape
通过阅读 skimage 文档,它可能试图将我的图像解释为 RGBA,然后失败了。 是否有强制 'uint16' 多页读取所有图像形状的解决方案?
如有任何建议,我们将不胜感激!
基于cgohlke的评论:
from dask.array.image import imread
import numpy as np
from skimage import io
import tifffile
# fake data
img_with_4_tiles = np.random.randint(0,65535,(4,10,20), dtype='uint16')
with tifffile.TiffWriter(r'D:tiles.tiff') as tif:
for frame in img_with_4_tiles:
tif.save(frame)
# my original bad solution
def read_with_pil(path):
return io.imread(path, plugin='pil', mode='L')
print(imread(r'D:tiles.tiff', imread=read_with_pil).shape)
# a good solution from the horse's mouth (https://pypi.org/user/cgohlke/)
def read_with_tifffile(path):
return tifffile.imread(path, is_shaped=False)
print(imread(r'D:tiles.tiff', imread=read_with_tifffile).shape)