python将字符串中编码的12位图像转换为8位png

2 投票
2 回答
4745 浏览
提问于 2025-04-15 22:36

我有一个字符串,这个字符串是从一个USB的Apogee相机读取的,里面包含的是12位的灰度图像。这12位数据占用了16位字中的最低12位。

我想从这个字符串创建一个8位的PNG图片,方法是忽略最低的4位。

我可以使用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位的图像,而不需要完全解包这个字符串,进行算术运算再生成一个新字符串呢?

编辑:Wump关于转换图像的评论给了我灵感,我通过以下方式实现了:

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

谢谢你,Wump

2 个回答

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位(据我所知),所以所有的值都会被限制在255以内 :)

编辑:去掉了中间的字符串转换,现在是直接从numpy转换到PIL。

2

Wump提到的关于转换图片的评论让我有了一个主意,我就这样做了

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

谢谢你,Wump

撰写回答