2

有谁知道从 PythonMagick.Image 实例获取像素数据而无需先将其写入磁盘的方法?

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

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

我现在希望能够获取未压缩的图像数据,以便可以在 NumPy 或 matplotlib 等其他东西中使用它,但我似乎找不到任何方法来做到这一点。我会直接使用 matplotlib 或 PIL,但我正在读取的图像格式是 JPEG 2000,据我所知,它仅受 PythonMagick 支持。

有什么建议么?

4

1 回答 1

3

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

pixelColor快速浏览一下代码,您似乎可以使用类上的方法逐个读取像素值Image。这将返回一个PythonMagick.Color值,您可以从中提取 R、G、B 分量。底层 C++ 库支持使用 一次读取大量像素Image::writePixels,这也存在于PythonMagick.Image; 但我认为正确使用该方法取决于 PythonMagick 中未实现的其他内容。很遗憾,因为我敢打赌它会比一次读取一个像素要高效得多。

或者,可能更好的是,看起来好像您可以将图像的内容写入PythonMagick.Blob内存中的对象,这与仅在没有文件的情况下写入文件的作用基本相同:-)。您可以选择写入的格式,就像写入文件时一样。似乎需要get_blob_data提取 a 的内容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或其他方式提取内容。

于 2011-03-31T14:59:44.197 回答