【问题标题】:How to resize an image but maintain pixel values in sk-image?如何调整图像大小但保持 sk-image 中的像素值?
【发布时间】:2020-01-25 08:35:37
【问题描述】:

我想调整图像大小。我的图像包含特定值 [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))

【问题讨论】:

  • 我猜如果你想保留原始像素值,结果图像会有锯齿。
  • @SaeedMasoomi 是的,我不介意。

标签: python scipy resize scikit-image


【解决方案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]

【讨论】:

    【解决方案2】:

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

    也就是说,在调整大小时使用order=0(对应于“最近邻”)而不是默认的order=1(对应于“双线性”)。

    各种插值方式详解here

    【讨论】:

    【解决方案3】:

    您不需要抗锯齿,但调整大小功能将默认应用它,(因此该功能将在图像上应用高斯核以消除锯齿)所以如果您想保留原始像素,您必须禁用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]
    

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

    anti_aliasingbool,可选

    是否应用高斯滤波器来平滑图像之前 缩小比例。在将图像下采样到 避免混叠伪影。

    【讨论】:

      猜你喜欢
      • 2019-11-29
      • 2013-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多