使用tifftools合并TIF文件后shape不符,如何确保形状正确?
解决多页TIF合并后skimage读取形状不符的问题
问题根源:你用tifftools直接合并IFDs生成的是多页TIF(每页对应一个独立的图像文件目录),而skimage.io.imread()默认只读取多页TIF的第一页,因此得到(512, 512);ImageJ保存的是将多页整合为三维数组的TIF格式,能被skimage识别为3D数据。
以下是几种可靠的解决方法:
方法1:用tifffile库生成3D堆栈TIF(推荐)
替换tifftools的合并逻辑,直接读取所有图像数据并堆叠为三维数组后保存,生成的文件天然支持skimage的3D读取:
import tifffile as tf import numpy as np # 生成图像路径列表 img_lst = [f'source_folder/image{i}.tif' for i in range(10)] # 读取所有图像并堆叠成三维数组 stack = np.stack([tf.imread(path) for path in img_lst]) # 保存为3D TIF tf.imwrite('folder_dest/image.tif', stack)
使用skimage.io.imread()读取该文件后,.shape将返回(10, 512, 512)。
方法2:调整skimage读取方式(无需修改合并文件)
如果不想重新生成文件,读取时显式读取多页TIF的所有页并堆叠:
from skimage.io import imread_collection, concatenate_images # 读取多页TIF的全部页面 img_collection = imread_collection('folder_dest/image.tif') stack = concatenate_images(img_collection) print(stack.shape) # 输出 (10, 512, 512)
也可以直接用tifffile库读取,它默认支持多页TIF转为三维数组:
import tifffile as tf stack = tf.imread('folder_dest/image.tif') print(stack.shape) # 输出 (10, 512, 512)
方法3:用tifftools生成可识别的3D堆栈
若坚持使用tifftools,需手动构建3D TIF的IFD结构,添加维度标签并合并像素数据:
import tifftools import numpy as np img_lst = [f'source_folder/image{i}.tif' for i in range(10)] images = [] for path in img_lst: # 读取图像数据(read_image=True 会加载像素数据) tiff_data = tifftools.read_tiff(path, read_image=True) images.append(tiff_data['ifds'][0]['data']) # 堆叠为三维数组 stack_data = np.stack(images) # 获取原图像的基础参数(根据你的实际图像调整) orig_ifd = tifftools.read_tiff(img_lst[0])['ifds'][0] bits_per_sample = orig_ifd['tags'][tifftools.Tag.BitsPerSample.value]['data'] photometric = orig_ifd['tags'][tifftools.Tag.PhotometricInterpretation.value]['data'] # 构建3D TIF的IFD new_ifd = { 'tags': { tifftools.Tag.ImageWidth.value: stack_data.shape[2], tifftools.Tag.ImageHeight.value: stack_data.shape[1], tifftools.Tag.SamplesPerPixel.value: 1, tifftools.Tag.BitsPerSample.value: bits_per_sample, tifftools.Tag.PhotometricInterpretation.value: photometric, tifftools.Tag.Compression.value: tifftools.Compression.None.value, tifftools.Tag.StripOffsets.value: [0], tifftools.Tag.RowsPerStrip.value: stack_data.shape[1], tifftools.Tag.StripByteCounts.value: [stack_data.nbytes], # 添加深度标签,标识第三维度数量 tifftools.Tag.ImageDepth.value: stack_data.shape[0], }, 'data': stack_data.tobytes() } # 写入文件 tifftools.write_tiff({'ifds': [new_ifd]}, 'folder_dest/image.tif')
注意:需确保BitsPerSample、PhotometricInterpretation等参数与原图像一致,避免数据损坏。
内容的提问来源于stack exchange,提问作者Bryan
相关产品推荐
相关产品推荐

