Ответ, который вы мне дали, великолепен и отлично извлекает информацию о пикселях (изменяя 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 ведет себя лучше.