调整 3D 图像大小(以及重采样)

6

我有一张三维脑图像(我们称其为flash),目前大小为263 x 256 x 185。我想将其调整为另一张图像的大小(我们称其为whole_brain_bravo):256 x 256 x 176,并且(希望)使用lanczos插值重新采样(Image.ANTIALIAS)。我的(失败的)尝试:

from scipy import ndimage as nd
import nibabel as nib
import numpy as np



a = nib.load('flash.hdr') # nib is what I use to load the images
b = nib.load('whole_brain_bravo.hdr')

flash = a.get_data() # Access data as array (in this case memmap)
whole = b.get_data()

downed = nd.interpolation.zoom(flash, zoom=b.shape) # This obviously doesn't work

你们有没有在3D图像上做过这样的事情?
2个回答

4

scipy.ndimage.interpolate.zoom的文档字符串中得知:

"""
zoom : float or sequence, optional
    The zoom factor along the axes. If a float, `zoom` is the same for each
    axis. If a sequence, `zoom` should contain one value for each axis.
"""

这两张图片的比例因子是多少?它在所有轴上是否相同(即等比缩放)?在这种情况下,zoom 应该是单个浮点数。否则,它应该是一个浮点数序列,每个轴对应一个。
例如,如果可以假定 wholeflash 的物理尺寸相等,那么您可以像这样操作:
 dsfactor = [w/float(f) for w,f in zip(whole.shape, flash.shape)]
 downed = nd.interpolation.zoom(flash, zoom=dsfactor)

这实际上很好,谢谢。你也知道如何重新采样缩小吗? - faskiat
这就是np.interpolation.zoomflash生成downed的方式!您可以通过order=参数更改它使用的样条插值顺序(我不知道numpy/scipy中任何Lanczos插值的实现)。 - ali_m
啊,我明白你的意思了。我本来希望能使用Lanczos算法,但这也不是什么大问题。而且,是的,Lanczos算法已经在Python图像处理库中实现了;根据文档,Image.ANTIALIAS实际上是一个用C语言编写的3-lobes Lanczos算法。 - faskiat
正如您已经知道的那样,PIL仅处理2D图像,因此您将受到对数组的2D切片重新采样的限制。我真的不认为您会在Lanczos和cubic spline插值之间看到太多实际差异。 - ali_m

2
根据文档,zoom参数是“沿坐标轴的缩放因子”。这有些模糊,但它听起来像是指比例因子,而不是所需的尺寸。
试试这个:
zoomFactors = [bi/float(ai) for ai, bi in zip(a, b)]
downed = nd.interpolation.zoom(flash, zoom=zoomFactors) 

对于选择过滤器不确定 - 文档只提到了各种阶数的样条插值。


你会如何在Python中对3D图像进行重采样?比如说,假设我给你一张图片,然后你看着它觉得“哦,这看起来很糟糕,我应该用最近邻法使它更好看一些”,你会怎么做呢? - faskiat
1
降采样图像有什么意义,会让它看起来更好吗?如果我想重新采样一个数组,我猜我会尝试使用scipy.ndimage.interpolation.zoom。这个方法对你不起作用吗?我相信有很多方法可以做到这一点,但除非你描述为什么这个方法不够好,否则我无法帮助你。 - Brionius
并不是说它不够好,只是我非常喜欢Lanczos方案在缩小JPEG图像时产生的效果,所以我想在3D图像中复制它。但这不是什么大问题,样条插值也很好(嘿嘿,我押韵了)。感谢您的帮助! - faskiat
啊,我明白了。我会找找看,但我脑海中并不知道如何使用Lanczos过滤器进行3D重采样 - 祝你好运! - Brionius
@elefun,使用order=0的插值缩放不适用于最近邻下采样吗? - adalca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接