【问题标题】:Image.open() gives a plain white imageImage.open() 给出一个纯白色的图像
【发布时间】:2020-08-30 20:24:02
【问题描述】:

我正在尝试编辑此图像:

但是,当我跑步时

im = Image.open(filename)
im.show()

它输出相同大小的完全纯白色图像。为什么Image.open() 不起作用?我怎样才能解决这个问题? 我可以使用另一个库来获取非 255 像素值(正确的像素数组)吗?

谢谢, 文尼

【问题讨论】:

  • 你用什么库来做 Image ?图片格式是什么?
  • from PIL import Image,图片是png的
  • 可以重现问题。图像显示为白色。与其他 png 一起工作正常。使用 ImageMagick(show 使用)直接打开图像可以正常工作。 im.save(new_name) 也可以正确保存图像,但出于某种原因,为show 创建的tmp 图像只是白色的。
  • 好的,谢谢@tobias_k。那么你会建议我如何获取该图像的像素值呢?我可以使用其他任何库吗?
  • 看起来getpixelputpixelsave 工作得很好,所以你仍然可以编辑/增强/任何图片并查看结果,只是不使用show

标签: python python-imaging-library


【解决方案1】:

Image.open 实际上似乎工作正常,getpixelputpixelsave 也是如此,因此您仍然可以加载、编辑和保存图像。

问题似乎是为show 保存图像的临时文件只是纯白色,因此图像查看器仅显示白色图像。您的原始图像是 16 位灰度,但临时图像保存为 8 位灰度。

我目前的理论是show 中实际上可能存在一个错误,其中通过将所有像素值限制为 255,将 16 位灰度图像“转换”为 8 位灰度,从而导致全白临时图像,因为原图所有像素值都在30000以上。

如果您在调用 show 之前将像素设置为低于 255 的值,则该像素会正确显示。因此,假设您想增强图片的对比度,您可以打开图片,将值映射到 0 到 255 的范围内(例如使用numpy),然后然后使用show .

from PIL import Image
import numpy as np
arr = np.array(Image.open("Rt5Ov.png"))
arr = (arr - arr.min()) * 255 // (arr.max() - arr.min())
img = Image.fromarray(arr.astype("uint8"))
img.show()

但如前所述,由于save 似乎可以正常工作,因此您也可以保留 16 位灰度深度,只保留编辑后的图像save,而不是使用show

【讨论】:

  • 附录:PIL 似乎只有 8 位 (L) 和 32 位 (I) 灰度图像的模式,所以我尝试将其保存为 32 位灰度,但事实并非如此工作(该格式似乎不存在或不受支持)。最初使用 alpha 保存为 16 位灰度似乎可行,但 PIL 将其打开为 RGBA,每个通道只有 8 位...
  • This answer 显示如何将图像打开为I;16,但show 仍然显示为白色。
【解决方案2】:

您可以使用 openCV 库来加载图像。

import cv2
img = cv2.imread('image file')
plt.show(img)

【讨论】:

  • 这会将文件读取为 8 位 RGB 图像,即使使用 cv2.IMREAD_GRAYSCALE 它也只能准备 8 位灰度图像,考虑到低对比度(所有像素值介于124 和 139)。此外,plt.show(img) 似乎没有做任何事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
  • 2014-03-04
  • 2016-04-16
  • 2011-01-27
相关资源
最近更新 更多