我有一张想要调整大小(高档)的图像。 我不希望在我的图像中引入额外的灰度级。这就是我使用最近邻插值的原因如下:
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 :(得分:5)
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]])
以下是使用imresize
将此数组传递给mode='L'
时会发生什么:
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)