如何获取PythonMagick图像的像素数据?

2 投票
1 回答
3130 浏览
提问于 2025-04-16 14:48

有没有人知道怎么从一个PythonMagick.Image实例中获取像素数据,而不需要先把它写到硬盘上?

比如,我可以用下面的代码读取一张图片:

import PythonMagick
im = PythonMagick.Image('image.jp2')

现在我想直接获取未压缩的图像数据,这样我就可以在其他地方使用,比如NumPy或者matplotlib,但我找不到任何方法来做到这一点。我本来可以直接使用matplotlib或者PIL,但我读取的图片格式是JPEG 2000,听说只有PythonMagick支持这种格式。

有什么建议吗?

1 个回答

3

免责声明: 我现在没有安装PythonMagick,也不是专家,所以以下内容可能有错误,可能不够具体。如果有人知道得更好,希望他们不会因为看到这里已经有答案而不愿意分享。无论如何:

从代码的快速浏览来看,似乎可以通过Image类中的pixelColor方法逐个读取像素值。这个方法会返回一个PythonMagick.Color值,你可以从中提取出红、绿、蓝(R、G、B)三个颜色分量。底层的C++库支持一次读取很多像素,使用Image::writePixels方法,这个方法在PythonMagick.Image中也有;但我觉得正确使用这个方法还依赖于一些在PythonMagick中没有实现的其他功能。这真可惜,因为我敢打赌,这样一次读取多个像素会比逐个读取高效得多。

另外,还有一个可能更好的方法,就是可以把图像的内容写入一个PythonMagick.Blob对象,这个过程基本上和写入文件一样,只是没有实际的文件 :-)。你可以选择写入的格式,就像写入文件时那样。似乎有一个叫get_blob_data的方法可以用来提取Blob的内容。大概是这样的:

im = PythonMagick.Image('image.jp2')
blob = PythonMagick.Blob()
im.write(blob, "png")
data = PythonMagick.get_blob_data(blob)

得到的data,我认为是一个Python字符串,它的字节是图像的二进制表示。(我假设你在使用Python 2.x,因为在这个版本中字符串是8位的。我不知道PythonMagick是否支持3.x。)我觉得有一些格式基本上是原始像素数据;可以试试“RGB”。然后你可以通过很多struct.unpack或者其他方法来提取内容。

撰写回答