Dus*_*Fdz 1 python 3d resize numpy scikit-image
我正在处理 3D CT 图像,并尝试将二进制分割掩码从 (564,359,359) 调整为 (128,128,128),如下所示:
from skimage.transform import resize
mask_resized= resize(binary_mask, (128, 128, 128), order=0)
Run Code Online (Sandbox Code Playgroud)
调整大小之前的二进制掩码如下所示:
生成的输出不是二进制的(产生 0 和 1 之间的一系列值),并且输出失真如下:
我尝试过image_resized_seg = np.rint(image_resized_seg),但这会为包含分割蒙版的某些切片生成全黑图像。
我也尝试了以下方法,它也给出了扭曲的图像,并且输出中缺少一些包含掩模的切片:
from scipy import ndimage
def resize_volume_mask(img):
"""Resize across z-axis"""
# Set the desired depth
desired_depth = 128
desired_width = 128
desired_height = 128
# Get current depth
current_depth = img.shape[0] #-1
current_width = img.shape[1] #0
current_height = img.shape[2] #1
# Compute depth factor
depth = current_depth / desired_depth
width = current_width / desired_width
height = current_height / desired_height
depth_factor = 1 / depth
width_factor = 1 / width
height_factor = 1 / height
# Rotate
#img = ndimage.rotate(img, 90, reshape=False)
# Resize across z-axis
img = ndimage.zoom(img, (depth_factor, width_factor, height_factor), order=0)
return img
Run Code Online (Sandbox Code Playgroud)
有人可以建议如何在不丢失信息的情况下调整分段掩码的大小,同时保持二进制吗?
结果输出不是二进制的
这个是正常的。当调整图像大小时,会执行插值。当目标图像小于源图像时尤其需要这样做,因为目标图像中的信息量较小。当目标图像较大时,插值方案能够获得对我们来说看起来“不错”的东西。
插值方法有很多种。最基本的就是最近的。它并没有真正对像素进行插值。相反,它会在源图像中找到与目标图像位置最接近的图像。典型的插值方法是双线性和三次插值(使用基本多项式)。默认情况下,skimage.transform.resize使用高斯滤波器进行下采样,因为anti_aliasing未设置并且输入数据类型不是bool:
是否在下采样之前应用高斯滤波器来平滑图像。在对图像进行下采样时进行过滤以避免混叠伪影至关重要。如果未指定,则在对数据类型非 bool 的图像进行下采样时设置为 True。
因此,您需要使用布尔掩码,而不是浮点掩码,或者设置anti_aliasing为false。
这会为包含分割蒙版的某些切片生成全黑图像。
这当然是因为图像中的浮点值的范围在 0 到 1 之间(这是定义为浮点值数组的图像的标准)。np.rint将产生 0-1 整数,skimage 将其解释为 0-255 范围内定义的像素的标准整数分量。结果,整个图像看起来是黑色的,但并不是完全黑色。您应该将结果乘以 255 才能看到该1值。
这也给出了扭曲图像
调整分割掩模的大小而不丢失信息
轻微变形是正常的。这是由于信息丢失造成的。几乎所有的缩小都会导致信息丢失(只有当源图像是缩小后的目标图像的放大版本时才会出现这种情况)。
缩小比例后使用阈值可得到以下图像:
与初始图像以及 skimage 之前使用高斯滤波器的事实相比,它看起来相当不错。使用anti_aliasing=false肯定会得到更好的结果。
总而言之,最好的解决方案当然是resize(binary_mask, (128, 128, 128), anti_aliasing=false, order=0)首先使用 调用或转换掩码resize(binary_mask.astype(bool), (128, 128, 128), order=0)。对于代码中的后续操作,您可能需要将结果转换回浮点。如果是这样,请注意该值的范围。