Получение данных пикселей из изображения PythonMagick? - PullRequest
2 голосов
/ 31 марта 2011

Кто-нибудь знает способ получения данных пикселей из экземпляра PythonMagick.Image без предварительной записи их на диск?

Например, я могу прочитать изображение, используя:

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

Теперь я хотел бы иметь возможность получить несжатые данные изображения, чтобы я мог использовать их в чем-то другом, например, в NumPy или matplotlib, но, похоже, я не могу найти никакого способа сделать это. Я бы просто использовал matplotlib или PIL напрямую, но формат изображения, в котором я читаю, - это JPEG 2000, который, насколько я знаю, поддерживается только PythonMagick.

Есть предложения?

1 Ответ

3 голосов
/ 31 марта 2011

Отказ от ответственности : у меня нет 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 или любого другого.

...