【问题标题】:Scaling image held in numpy array cannot be undone无法撤消 numpy 数组中保存的缩放图像
【发布时间】:2017-05-05 03:04:43
【问题描述】:

我将图像作为像素数据加载到 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

【问题讨论】:

  • 在计算的各个阶段检查dtype

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


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

【讨论】:

  • 我认为这不是问题所在。 OP 的数组检查相等...show() 更有可能是一些问题。
  • @Praveen 测试表明存在可能导致模糊性的不等式,也许 show() 确保正确转换回来..
【解决方案2】:

问题是数组被255乘除后变成了浮点数组:

>>> a = misc.imread(path)
>>> a.dtype
dtype('uint8')
>>> b = a / 255
>>> b = b * 255
>>> b.dtype
dtype('float64')

我的猜测是img.show() 函数不知道如何显示浮点数。可能它将浮点数解释为 uint8 或类似的,并尝试以某种方式显示它们。不幸的是,img.show()docs 并没有告诉我们它是如何工作的。

Scipy 的 misc 模块有自己的 imshow,但是,它工作正常:

>>> misc.imshow(b)

在相关说明中,如果您正在考虑同时使用scipy.miscPIL/pillow,那么它们处理数组的方式似乎有所不同。例如,请参阅this 问题。

【讨论】:

  • 看起来它的高阶位已关闭。如果我将 numpy 数组转换为 unsigned int 它可以解决问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-01-19
  • 2018-05-15
  • 2010-10-28
  • 2011-04-28
  • 1970-01-01
  • 2021-10-07
  • 2019-01-11
相关资源
最近更新 更多