Получение данных пикселей из изображения PythonMagick?
Кто-нибудь знает способ получить данные пикселей из экземпляра PythonMagick.Image без предварительной записи их на диск?
Например, я могу прочитать изображение, используя:
import PythonMagick
im = PythonMagick.Image('image.jp2')
Теперь я хотел бы иметь возможность получить несжатые данные изображения, чтобы я мог использовать их в чем-то другом, например, в NumPy или matplotlib, но я не могу найти какой-либо способ сделать это. Я бы просто использовал matplotlib или PIL напрямую, но формат изображения, в котором я читаю, - это JPEG 2000, который, насколько я знаю, поддерживается только PythonMagick.
Какие-либо предложения?
1 ответ
Отказ от ответственности: у меня нет 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
или что угодно.