Извлечение данных PythonMagick для JPEG2000 - PullRequest
1 голос
/ 19 октября 2011

Я работаю в приложении, которое (помимо прочего) должно считывать спутниковое изображение (только с одной полосой на изображение) и обрабатывать данные пикселей.

Формат JPEG-2000, и поэтому я не могу использовать библиотеку PIL (которая все упрощает). Я нашел библиотеку PythonMagick, и я прекрасно могу прочитать изображение и извлечь значение пикселя. Но только на один пиксель!

im=PythonMagick.Image(dirimage)      # (This is very slow....)
a=im.pixelColor(j-1,i-1).intensity() # the value intensity is extracted for one pixel
a=a/int(XML_var[37][2])              # the reflectance values are normalised to the range [0,1]

Поэтому мне нужен цикл for, чтобы получить все значения пикселей (изображения очень большие). Я пытался с помощью функции Blob получить данные, но они вылетали.

Есть ли лучшие варианты? Как я могу быстро получить данные пикселей изображения JPEG2000 и сохранить их в массив?

Ответы [ 3 ]

2 голосов
/ 25 ноября 2011

Ответ, который вы мне дали, великолепен и отлично извлекает информацию о пикселях (изменяя uint8 на uint16).Тем не менее, значения, которые я получаю, выше, чем реальные.Существует смещение, и из-за сжатия LOSSY в JPEG2000 есть небольшая ошибка в значении 1 или 2.

Я не люблю использовать внешние вызовы, но в этом случае я нашел это как лучшееи более быстрое решение:

Я скачал Kakadu (бесплатное программное обеспечение для некоммерческих целей) и использую модуль kdu_expand.

os.system ('kdu_expand -i image.jp2 -o temp_image.tif')

im = PIL.Image.open (' temp_image.tif ')

пикселей = массив (im.getdata ()). Reshape ((im.size [0], im.size [1]))

Я конвертирую изображение из JPEG2000 в TIF, но это быстро, и статическая память обычно не является ограничением (в настоящее время) в компьютере.Затем библиотека PIL прекрасно справляется с извлечением данных.

Примечание: я попытался преобразовать напрямую с помощью PythonMagick, но он дает мне то же смещение, что и раньше

Примечание 2: Я нашел другую интересную библиотекув OpenCV, но результат неверный

пикселей_cv2 = cv2.imread ('image.jp2', 0)

Примечание 3: Используемые мной изображения являются спутниковыми изображениями, кодированными с 12 фрагментами.Возможно, в другом типе данных PythonMagick ведет себя лучше.

2 голосов
/ 20 октября 2011

Использование BLOB-объектов должно работать:

import numpy
from PythonMagick import Image, Blob

i = Image('http://www.microimages.com/gallery/jp2/potholes2.jp2')
b = Blob()
i.write(b, 'GRAY')
a = numpy.fromstring(b.data, 'uint8').reshape((i.rows(), i.columns()))
0 голосов
/ 11 октября 2016

Я скачал Kakadu (бесплатное программное обеспечение для некоммерческих целей) и используйте модуль kdu_expand.

os.system ('kdu_expand -i image.jp2 -o temp_image.tif')

Небольшой комментарий не по теме для тех, кто запускает демонстрацию Kakadu (KDU). Хотелось бы добавить, что при запуске kdu_expand, как указано выше: os.system ('kdu_expand -i image.jp2 -o temp_image.tif'), и это выдает ошибку:

dyld: Library not loaded: /usr/local/lib/libkdu_v78R.dylib
  Referenced from: /usr/local/bin/kdu_expand
  Reason: no suitable image found.  Did find:
    /usr/local/lib/libkdu_v78R.dylib: open() failed with errno=13
    /usr/local/lib/libkdu_v78R.dylib: open() failed with errno=13
Trace/BPT trap: 5

Проверьте разрешения libkdu_v78R.dylib и измените их на 644 или 666, или что-то с доступом для чтения / записи.

...