Чтение необработанных изображений с помощью PIL и Python - PullRequest
1 голос
/ 23 декабря 2010

У меня есть изображение размером 7 ГБ, которое я получил от НАСА, и я хотел написать декодер, используя Python и PIL. На странице, откуда я получил изображение, указано следующее:

Данные отформатированы как одноканальное 16-разрядное целое число (два байт, длинный) необработанный двоичный файл со знаком, с байтовым порядком байтов заголовок.

Вот документация для написания декодера изображений, но у меня нет большого опыта работы с изображениями в Python, и я в полном недоумении

Ответы [ 3 ]

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

Я много работаю с необработанными изображениями, некоторые в 16-битных, а некоторые в 8-битных оттенках серого.

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

Если есть проблема с порядком байтов, то команда numpy array.byteswap () должна позаботиться об этом перед преобразованием в объект изображения PIL.

Этот код взят из программы, котораяработает для чтения 8-битных необработанных изображений в PIL:

scene_infile = open(scene_infile_fullname,'rb')
scene_image_array = fromfile(scene_infile,dtype=uint8,count=rows*columns)
scene_image = Image.frombuffer("I",[columns,rows],
                                     scene_image_array.astype('I'),
                                     'raw','I',0,1)

Во второй строке при переходе от uint8 к uint16 будет загружен 2-байтовый вместо 1-байтового необработанного изображения.В третьей строке изображение преобразуется в 4-байтовое целое число, так как некоторые из процедур PIL, кажется, лучше работают с этим типом.

0 голосов
/ 23 декабря 2010

Обнаружено это в .../Imaging-1.1.7/PIL/Image.py источниках для PIL v1.1.7, обратите внимание на комментарий в конце о некоторых "экспериментальных режимах":

# --------------------------------------------------------------------
# Modes supported by this version

_MODEINFO = {
    # NOTE: this table will be removed in future versions.  use
    # getmode* functions or ImageMode descriptors instead.

    # official modes
    "1": ("L", "L", ("1",)),
    "L": ("L", "L", ("L",)),
    "I": ("L", "I", ("I",)),
    "F": ("L", "F", ("F",)),
    "P": ("RGB", "L", ("P",)),
    "RGB": ("RGB", "L", ("R", "G", "B")),
    "RGBX": ("RGB", "L", ("R", "G", "B", "X")),
    "RGBA": ("RGB", "L", ("R", "G", "B", "A")),
    "CMYK": ("RGB", "L", ("C", "M", "Y", "K")),
    "YCbCr": ("RGB", "L", ("Y", "Cb", "Cr")),

    # Experimental modes include I;16, I;16L, I;16B, RGBa, BGR;15, and
    # BGR;24.  Use these modes only if you know exactly what you're
    # doing...

}

Так что, похоже, в нем есть какая-то поддержка16-битные изображения.

UTSL - используйте источник Luke

0 голосов
/ 23 декабря 2010

Проблема, с которой вы сталкиваетесь, заключается в том, что файлы представляют собой 16-битные пиксели, когда PIL поддерживает только 8-битные пиксели в предоставленном списке, и 16-битные порядковые номера в этом письме по той же теме:

http://osdir.com/ml/python.image/2006-11/msg00021.html

Это было 4 года назад, и в этом году снова поднимается та же тема:

http://mail.python.org/pipermail/image-sig/2010-April/006166.html

...