我要调整图像大小。我的图像包含特定的值[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))
答案 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,可选
是否应用高斯滤镜来平滑图像,然后再 缩小规模。对图像进行下采样时进行过滤至关重要 避免出现混淆现象。