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

问题描述 投票:1回答:3

我想调整图像尺寸。我的图像包含特定的值[0、1、2、7、9]。调整大小后,将引入新的值,例如5,而不是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))
python opencv scipy resize scikit-image
3个回答
1
投票

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

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

阐述各种插补类型here


1
投票

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
投票

您不希望使用抗锯齿功能,但是默认情况下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,可选

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

© www.soinside.com 2019 - 2024. All rights reserved.