如何调整图像大小,但保持sk-image中的像素值?

时间:2020-01-25 08:35:37

标签: python scipy resize scikit-image

我要调整图像大小。我的图像包含特定的值[0、1、2、7、9]。调整大小后,将引入新的值,例如5等。我想防止这种情况。

我当前正在使用scikit图片调整大小功能。我已经尝试了所有插值标志,但无济于事。

编辑:显示问题的简单代码

import numpy as np
from skimage.transform import resize
vals = [0, 1, 4, 6]
N, M = 100, 100
image = np.random.choice(vals, N * M).reshape(N, M).astype('uint8')
resized_image = resize(image, (50, 50), preserve_range=True).astype('uint8')

print('vals before resizing ', np.unique(image))
print('vals after resizing ', np.unique(resized_image))

3 个答案:

答案 0 :(得分:2)

anti_aliasing设置为False

resized_image = resize(image, (50, 50), order=0, preserve_range=True, anti_aliasing=False).astype('uint8')

anti_aliasingbool,可选
是否在缩小之前应用高斯滤波器对图像进行平滑处理。在对图像进行下采样时,进行过滤至关重要,以免产生锯齿现象。

混叠滤波器应用高斯滤波器,该滤波器会产生新值。


结果:

vals before resizing  [0 1 4 6]
vals after resizing  [0 1 4 6]

答案 1 :(得分:1)

如果要避免引入新值,则需要避免线性,双线性,二次和其他“已计算” 插值类型,并使用NEAREST_NEIGHBOUR插值。这对于调色板(即索引)图像和分类图像尤为重要,其中每个数字代表一个类别,这可能意味着在代表“森林”的类别与代表“高速公路”的相邻类别之间进行插值会突然引入一些新的内容。两者之间的价值意味着您已经在亚利桑那州建造了海滩!

这意味着,请使用order=0(对应于“最近的邻居” ),而不要使用默认的order=1(对应于“双线性” )调整大小时。

here阐述了各种类型的插值。

答案 2 :(得分:1)

您不希望使用抗锯齿功能,但是默认情况下resize功能将应用该功能(因此该功能将在图像上应用高斯内核以消除锯齿),因此,如果要保留原始像素,则必须禁用由anti_aliasing=False

标记
resized_image = resize(image, (50, 50), preserve_range=True, anti_aliasing=False,order=0).astype('uint8')

通过此更改,输出将是:

vals before resizing  [0 1 4 6]
vals after resizing  [0 1 4 6]

通过查看调整大小函数文档,我们可以看到,只有当调整大小后的图像小于原始大小时,高斯内核才适用。(这是您的情况)

anti_aliasingbool,可选

是否应用高斯滤镜来平滑图像,然后再 缩小规模。对图像进行下采样时进行过滤至关重要 避免出现混淆现象。

相关问题