2

我有一个从 USB 远地点相机读取的字符串,它是一个 12 位灰度图像,每个 12 位占用 16 位字的最低 12 位。我想通过忽略最低 4 位从这个字符串创建一个 8 位 png。

我可以使用 PIL 将其转换为 16 位图像,其中最高 4 位始终为零

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.

谢谢乌普

4

2 回答 2

2

Wump关于转换图像的评论给了我一个想法,我做到了

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

谢谢乌普

于 2010-05-13T18:33:16.010 回答
1

我知道该怎么做的唯一方法是:

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

于 2010-05-12T13:57:52.833 回答