scipy.misc.imresize()的灰度级不会保持不变

Sha*_*han 2 python image scipy

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

  scipy.misc.imresize(image, image2.shape, interp="nearest",mode="L")
Run Code Online (Sandbox Code Playgroud)

图像中的原始灰度级别:

[ 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]
Run Code Online (Sandbox Code Playgroud)

插值后:

[  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]
Run Code Online (Sandbox Code Playgroud)

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

War*_*ser 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]])
Run Code Online (Sandbox Code Playgroud)

下面是当这个数组传递到会发生什么imresizemode='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)
Run Code Online (Sandbox Code Playgroud)

如果首先转换为输入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)
Run Code Online (Sandbox Code Playgroud)