从PythonMagick图像获取像素数据?

时间:2011-03-31 14:03:47

标签: python imagemagick jpeg2000

有没有人知道从PythonMagick.Image实例获取像素数据而不必先将其写入磁盘?

例如,我可以使用以下方式读取图像:

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

我现在希望能够获得未压缩的图像数据,以便我可以在NumPy或matplotlib之类的其他内容中使用它,但我似乎无法找到任何方法来执行此操作。我只是直接使用matplotlib或PIL,但我正在阅读的图像格式是JPEG 2000,据我所知,只有PythonMagick支持。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

免责声明:我现在没有构建PythonMagick并且不是专家,因此(1)以下任何或所有可能都是错误的,(2)它肯定会是比你想要的更具体,(3)如果其他人知道的更好,我希望他们不会因为已经在这里找到答案而被推迟。无论如何:

通过快速查看代码,您可以使用pixelColor类上的Image方法逐个读取像素值。这将返回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或其他任何内容提取内容。