skimage.transform.rescale 为输入图像添加一个额外的维度

skimage.transform.rescale adds an extra dimension to input image

当使用 skimage.transform.rescale() 时,当我的输入图像只有 2 维时,我得到了一个具有 3 维的输出图像数组。

from skimage import io, color, transform

image = io.imread(r'C:\Users\ParthD\PycharmProjects\pythonProject\test_images.png')
image_bw = color.rgb2gray(color.rgba2rgb(image))
image_rescaled = transform.rescale(image, scale=0.5, anti_aliasing=True)

print(image_bw.shape)
print(image_rescaled.shape)

对此我得到的输出为:

(397, 602)
(198, 301, 2)

值 2 的附加维度在哪里被加起来,我不确定。我检查了 rescale 函数文档,但没有任何参数有助于这个额外的维度。

所以问题是通道维度被解释为空间维度。

您应该传递 transform.rescale multichannel=True 标志,这样它就不会影响频道:

image_rescaled = transform.rescale(image, scale=0.5, anti_aliasing=True, multichannel=True)
  • 示例:

    q = np.zeros((397, 602, 3))
    x1 = transform.rescale(q, scale=0.5, anti_aliasing=True)
    x2 = transform.rescale(q, scale=0.5, anti_aliasing=True, multichannel=True)
    x1.shape  # (198, 301, 2)
    x2.shape  # (198, 301, 3)
    

所以 transform.rescale 将您的阵列视为形状为 (397, 602, 3) 的 3D 图像,它向下延伸到 (198, 301, 2),也与通道一起插值,就好像它们是另一个空间维度。

如果您的图像是灰度图像,没有通道维度,则不需要传递 multichannel=True 标志。这将导致最后一个轴被视为通道,并且您会得到不需要的输出。

  • 示例:

    q1 = np.zeros((397, 602))
    x3 = transform.rescale(q1, scale=0.5, anti_aliasing=True, multichannel=True)
    x4 = transform.rescale(q1, scale=0.5, anti_aliasing=True)
    x3.shape  # (198, 602)
    x4.shape  # (198, 301)
    

可以参考docs