【问题标题】:The gray levels don't remain the same with scipy.misc.imresize()灰度与 scipy.misc.imresize() 不同
【发布时间】:2016-01-10 15:38:45
【问题描述】:

我有一张想要调整大小(高档)的图片。 我不希望在我的图像中引入额外的灰度级。这就是为什么我使用最近邻插值如下:

  scipy.misc.imresize(image, image2.shape, interp="nearest",mode="L")

图像中的原始灰度:

[ 0  2  4  5  8  9 10 11 12 14 15 16 17 18 19 20 21 22 23 25 26 27 28 29 30
31 32 35 36 37 38 41 43 45 46 47 51]

插值后:

[  0  10  20  25  40  45  50  55  60  70  75  80  85  90  95 100 105 110
115 125 130 135 140 145 150 155 160 175 180 185 190 205 215 225 230 235
255]

我也尝试过更改模式,但没有帮助。 我不知道如何解决它。

【问题讨论】:

  • 有趣的是所有新值都是 的倍数,真的很有趣
  • 似乎它只是重新调整了您的灰度级以适应范围 0..255。你能提供一个MRE吗?我无法重现这个。

标签: python image scipy


【解决方案1】:

imresize 使用 PIL 或 Pillow 来完成实际工作。转换为具有模式“L”的 PIL 图像会触发数据值的重新缩放。如果输入数据类型不是 8 位,则将值缩放以填充 8 位范围。

避免这种情况的一种方法是确保输入数组的数据类型为numpy.uint8。然后这些值不会重新缩放。

例如,这里是一个 64 位值的 3x4 图像(即数组的数据类型是numpy.int64):

In [132]: img
Out[132]: 
array([[ 1,  1,  2, 17],
       [ 4,  3,  1,  2],
       [ 1,  5,  4,  2]])

当这个数组通过mode='L' 传递给imresize 时会发生以下情况:

In [133]: imresize(img, (6, 8), interp='nearest', mode='L')
Out[133]: 
array([[  0,   0,   0,   0,  16,  16, 255, 255],
       [  0,   0,   0,   0,  16,  16, 255, 255],
       [ 48,  48,  32,  32,   0,   0,  16,  16],
       [ 48,  48,  32,  32,   0,   0,  16,  16],
       [  0,   0,  64,  64,  48,  48,  16,  16],
       [  0,   0,  64,  64,  48,  48,  16,  16]], dtype=uint8)

如果输入首先转换为np.uint8,则不会重新调整值:

In [134]: imresize(img.astype(np.uint8), (6, 8), interp='nearest', mode='L')
Out[134]: 
array([[ 1,  1,  1,  1,  2,  2, 17, 17],
       [ 1,  1,  1,  1,  2,  2, 17, 17],
       [ 4,  4,  3,  3,  1,  1,  2,  2],
       [ 4,  4,  3,  3,  1,  1,  2,  2],
       [ 1,  1,  5,  5,  4,  4,  2,  2],
       [ 1,  1,  5,  5,  4,  4,  2,  2]], dtype=uint8)

【讨论】:

  • 我明白了,我在测试中将uint8 数组传递给imresize,这就是我没有看到重新缩放的原因。
猜你喜欢
  • 2020-03-10
  • 2016-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
  • 2018-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多