【问题标题】:Get RGB image pixel values as 16bit and fill lists将 RGB 图像像素值获取为 16 位并填充列表
【发布时间】:2018-06-10 12:01:15
【问题描述】:

使用 ImageMagick,我可以将任何图像转换为具有每个 (RGB) 像素的像素/值表示的文本文件。这是通过“convert spektrum.png spektrum.txt”获得的 16 位整数 png 文件的示例输出

# ImageMagick pixel enumeration: 1553,24,65535,srgba
0,0: (16192,7721,24114,65535)  #3F401E295E32FFFF  srgba(25%,12%,37%,1)

这表示图像中的第一个左上角像素 (0,0) 及其 rgb(a) 值。

问题: 如何使用 Python(3) 将相同的图像读取到具有 16 位值的列表/数组中?如果我用枕头来阅读这个 PNG 文件

from PIL import Image
im = Image.open("spektrum.png")
pix = im.load()
print(pix[2,5])
(67, 35, 99, 255)

我只能从中得到 0-255 个 RGBA 值。

【问题讨论】:

  • 可能有更简单的方法,但试试这个convert spektrum.png -compress none pnm:-
  • @MarkSetchell 好主意,但是以我不理解的模式吐出 rgb 值,我看不到解析该输出的方法。它应该是“Plain PPM(PNM)”,如此处所述:netpbm.sourceforge.net/doc/ppm.html 但输出不跟随它。看起来输出只是一个像素一个像素的 R-G-B 值,但在某处是我不理解的换行符。
  • Pillow 好像不支持 16 位。“抱歉,这是 Pillow 的限制。我们无法读取每个通道超过 8 位的多通道图像。” github.com/python-pillow/Pillow/issues/…
  • 我发现python/opencv可以读取16bit,我试试看

标签: python image pixel 16-bit


【解决方案1】:

我现在可以用 opencv 读取 16 位值:

>>> import cv2
>>> img = cv2.imread('spektrum.png',-1) # -1 read format as is
>>> print(img.dtype)
uint16
>>> px = img[0,0]
>>> print(px)
[24114  7721 16192 65535]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 2020-08-23
    • 1970-01-01
    • 2020-07-30
    相关资源
    最近更新 更多