python - 如何在不更改图像的情况下将 3d RGB NumPy 数组转换为浮点数?
问题描述
我正在尝试保存 RGB 像素形式的图像。无论出于何种原因,当我调用 时matplotlib.pyplot.imshow
,图像都会正确显示。
但是,当我调用 时matplotlib.pyplot.imsave
,我收到一个错误,即数组必须在float
. 当我决定将所有值更改为 时float
,图像被完全修改。对我来说完全是无稽之谈。
def display_image(pixels, name=""):
if name:
plt.imsave(name, array)
plt.imshow(array)
pixels = im.getdata()
pixelMap = im.load()
npImage = np.array(pixels).reshape(671, 450, 3)
display_image(npImage) ## great!
# things that I tried
display_image(npImage, "image.jpg") ## error, must be floats.
# changes the images
pixels = list(pixels) ## pixels var originally imagecore class
for index in range(len(pixels)):
pixels[index] = (float(pixels[index][0]), float(pixels[index][1]), float(pixels[index][2]))
display_image(npImage, "monaLisa.jpg") ## works but incorrect image
解决方案
在我回答您的实际问题之前,请先谈谈您的评论,以及为什么您可能会对您的问题投反对票。您的代码不是最小的、可重现的示例,也不能按原样工作。
您缺少所有必要的导入:
from matplotlib import pyplot as plt
import numpy as np
from PIL import Image
您的方法参数之一是错误的:
def display_image(pixels, name=""): # <-- I assume, pixels should be array here.
if name:
plt.imsave(name, array)
plt.imshow(array)
plt.show() # <-- Without, there's no actual output.
是什么im
?最有可能的是,这是一些 PIL 图像。此外,您硬编码了一些值,但没有提供相应的图像。
im = Image.open('someImage.jpg') # <-- Need to load some image at all.
pixels = im.getdata()
pixelMap = im.load()
npImage = np.array(pixels).reshape(671, 450, 3) # <-- That only works for images with the specific size
display_image(npImage) ## great!
在最后一个测试用例中,您没有更新npImage
:
pixels = list(pixels) ## pixels var originally imagecore class
for index in range(len(pixels)):
pixels[index] = (float(pixels[index][0]), float(pixels[index][1]), float(pixels[index][2]))
# <-- You updated pixels, but not npImage
display_image(npImage, "monaLisa.jpg")
只有在解决了所有这些问题之后,才会出现实际错误,你在你的问题中谈论!
现在,对于您的错误:
Traceback (most recent call last):
File "[...].py", line 18, in <module>
display_image(npImage, "image.jpg") ## error, must be floats.
[...]
ValueError: Image RGB array must be uint8 or floating point; found int32
你npImage
是 type int32
,但plt.imsave
期望uint8
(values0 ... 255)
或float
(values 0.0 ... 1.0
) 用于写作。
所以,让我们强制执行uint8
:
npImage = np.array(pixels, dtype=np.uint8).reshape(..., 3)
添加必要的更新后npImage
,如上所述
pixels = list(pixels) ## pixels var originally imagecore class
for index in range(len(pixels)):
pixels[index] = (float(pixels[index][0]), float(pixels[index][1]), float(pixels[index][2]))
npImage = np.array(pixels).reshape(..., 3) # <-- This line
display_image(npImage, "monaLisa.jpg") ## works but incorrect image
出现以下错误:
Traceback (most recent call last):
File "[...].py", line 25, in <module>
display_image(npImage, "monaLisa.jpg") ## works but incorrect image
[...]
ValueError: Floating point image RGB values must be in the 0..1 range.
您尚未将float
值缩放到0.0 ... 1.0
. 因此,我们只需除以255
:
npImage = np.array(pixels).reshape(..., 3) / 255
我无法重现您的“完全修改的图像”(由于可能缺少代码片段),但这很可能也是由于未缩放的float
值,您可能看到了剪辑。(图像几乎是白色的吗?)
希望有帮助!
推荐阅读
- javascript - 是否可以将动态命名的对象添加到 JavaScript 对象?
- javascript - 部署firebase时解析错误
- php - 如何从 textarea 添加一个 worpress 过滤器
- angular - StaticInjectorError(Platform: core)[RegisterStoreComponent -> Router]: NullInjectorError: No provider for Router!Angular 5.2 / Karma-jasmine
- python - 有没有办法围绕指定点堆叠多个 2D(numpy)图像数组?
- javascript - setInterval - 一个接一个地运行第二个函数
- php - 比较 2 个数组并将其中一个更新为始终与另一个相同
- python-3.x - 返回文件未找到错误
- ruby-on-rails - I18n 语言环境列表未在开发服务器上加载
- php - 获取次日交货时间,但没有周日 PHP / Wordpress 功能