import glob
import tifffile
with tifffile.TiffWriter('images/for_alignment/stacks.tif')as stack:
for filename in glob.glob('images/for_alignment/SEM_image_stack/*.tif'):
stack.save(tifffile.imread(filename))
from pystackreg import StackReg
from skimage import io
img0=io.imread('images/for_alignment/stacks.tif')
print(img0.shape)
#但结果只显示(4096,6144)
#实际还有20层,应该是(20,4096,6144)
引用 皆我百晓生 小程序回复内容作答:
io.imread函数默认假定输入的图像是二维的,并将其解释为一个灰度图像。如果你有一个多层的图像栈,在使用io.imread函数读入时,它仅会返回一个二维的图像(即其中一层),而不是一个三维的图像。
为了读入一个多层的图像栈作为一个三维的数组,你可以使用tifffile库的imread函数,并指定multifile参数为True。这样,imread函数会读取整个图像栈,并将其作为一个三维数组返回。
修改你的代码如下:
import glob
import tifffile
with tifffile.TiffWriter('images/for_alignment/stacks.tif') as stack:
for filename in glob.glob('images/for_alignment/SEM_image_stack/*.tif'):
stack.save(tifffile.imread(filename))
from pystackreg import StackReg
from tifffile import imread
img0 = imread('images/for_alignment/stacks.tif', multifile=True)
print(img0.shape) # 输出结果应该为 (20, 4096, 6144)
引入了tifffile的imread函数,并指定multifile参数为True,这样读入的图像栈会作为一个三维数组返回。
【以下回答由 GPT 生成】
问题的原因是在保存图像栈为tiff文件时,没有指定压缩格式参数。默认情况下,tifffile.TiffWriter会使用LZW压缩格式保存图像,但io.imread函数无法正确读取该格式的图像。
为了解决这个问题,您可以在保存图像栈为tiff文件时,明确指定不使用压缩格式(参数compress=None)。以下是修改后的代码:
import glob
import tifffile
from skimage import io
# 将图像栈保存为一个tiff文件,不使用压缩格式
with tifffile.TiffWriter('images/for_alignment/stacks.tif', compress=None) as stack:
for filename in glob.glob('images/for_alignment/SEM_image_stack/*.tif'):
stack.save(tifffile.imread(filename))
# 使用io.imread读入图像栈
img0 = io.imread('images/for_alignment/stacks.tif')
print(img0.shape)
# 输出结果为(20, 4096, 6144)
通过明确指定不使用压缩格式,保存的tiff图像栈可以正确地被io.imread函数读取,并得到期望的结果。
希望通过上述修改能够解决您的问题。如果还有其他疑问,请随时提问。