Python конвертировать 12-битное изображение, закодированное в строку, в 8-битный PNG - PullRequest
2 голосов
/ 12 мая 2010

У меня есть строка, которая считывается с камеры апогея USB, которая представляет собой 12-битное изображение в градациях серого с 12-битным изображением, каждое из которых занимает младшие 12 бит из 16-битных слов. Я хочу создать 8-битный png из этой строки, игнорируя младшие 4 бита.

Я могу преобразовать его в 16-битное изображение, где старшие 4 бита всегда равны нулю, используя PIL с

import Image

#imageStr is the image string
#imageSize is the image size 

img=Image.fromstring("I", imageSize, imageStr, "raw", "I;16", 0,1)
img.save("MyImage.png", "PNG")

В любом случае, можно ли сделать что-то похожее для создания 8-битного изображения без полной распаковки строки, выполнения арифметики и создания новой строки?

Редактировать: Комментарий Wumps о преобразовании изображения дал мне идею, и я сделал это

img = img.point(lambda i: i * 16, "L") #shifts by 4 bits and converts to 8-bit image.

Спасибо Wump

Ответы [ 2 ]

2 голосов
/ 13 мая 2010

Комментарий Wump о преобразовании изображения дал мне идею, и я сделал это

#shifts by 4 bits and converts to 8-bit image
img = img.point(lambda i: i * 16, "L") 

Спасибо Wump

1 голос
/ 12 мая 2010

Единственный способ, которым я знаю, как это сделать, будет:

data = numpy.fromstring(imageStr, numpy.uint16)
data >>= 4 # shift out four bits
data = numpy.array(data, dtype=numpy.uint8)
img = Image.fromarray(data.reshape(imageSize))

В принчипе PIL может конвертировать изображения следующим образом:

img = img.convert("L")

Но проблема в том, что у него нет способа снизить точность до 8 бит (AFAIK), поэтому все будет обрезано до 255:)

Редактировать: удалено преобразование промежуточной строки, теперь оно идет прямо из numpy в PIL

...