python将字符串中编码的12位图像转换为8位png
我有一个字符串,这个字符串是从一个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