stack数据io.imread读入三维数组层数无法显示,成二维?

tiff格式是一个图像栈stack,但是io.imread读入的实际应该是一个三维数组,为什么只显示二维信息,没有层数显示
skimage '0.21.0'
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)
我想要达到的结果(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函数读取,并得到期望的结果。

希望通过上述修改能够解决您的问题。如果还有其他疑问,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^