缩放numpy数组中的缩放图像无法撤消

时间:2016-12-20 00:30:10

标签: python image numpy scipy python-imaging-library

我将图像作为像素数据加载到numpy数组(subjectImage)中。以下代码行成功将numpy数组恢复为图像并显示它:

subjectImagePath = 'pathToFile/cat.0.jpg'        
subjectImage = misc.imresize(misc.imread(subjectImagePath), (224,224,3))
img = Image.fromarray(subjectImage, 'RGB')
img.show()

但是,如果我将图像的像素值缩放到0和1之间,那么我无法将图像恢复为原始形式。 (它显示一堆噪音)

subjectImage = subjectImage/255
subjectImage = subjectImage*255
img = Image.fromarray(subjectImage, 'RGB')
img.show()

Numpy甚至告诉我阵列是一样的。

orig = subjectImage
subjectImage = subjectImage/255
print(np.array_equal(orig, subjectImage*255)) # => Prints True

我想知道可能导致这种情况的原因是什么?任何帮助都会很棒!

使用的图书馆:

import numpy as np
from PIL import Image
from scipy import misc

2 个答案:

答案 0 :(得分:1)

浮点表示和dtype的有趣示例...检查以下示例。您可以打印数组以查看不等式的存在位置。以下简化了结果和比较。

>>> a = np.arange(5*5*3, dtype=np.int64)
>>> b = a/(5*5)
>>> c = b*(5*5)
>>> d = np.around(b*(5*5))
>>> a[a!=c]
array([ 7, 14, 28, 29, 55, 56, 57, 58])
>>> a[a!=d]
array([], dtype=int64)

答案 1 :(得分:1)

问题是乘法和除以255后的数组变为浮点数组:

nltk

我的猜测是>>> a = misc.imread(path) >>> a.dtype dtype('uint8') >>> b = a / 255 >>> b = b * 255 >>> b.dtype dtype('float64') 函数不知道如何显示浮点数。可能它将浮动解释为uint8,或者其他一些并尝试以某种方式显示它们。不幸的是,img.show()的{​​{3}}并没有告诉我们它是如何运作的。

Scipy的img.show()模块有自己的docs,但是,它可以正常工作:

misc

在相关的说明中,如果您考虑同时使用>>> misc.imshow(b) scipy.misc / PIL,则他们对待数组的方式似乎有所不同。例如,请参阅imshow问题。