用PIL和Python读取原始图像
我有一张从NASA获得的7GB图像,我想用Python和PIL编写一个解码器。从那里我得到的图像的页面出现如下提示:用PIL和Python读取原始图像
的数据被格式化为 单通道16位整数(二 字节,长)与大端签署原始的二进制文件, 字节顺序并且没有 标题。
Here's用于写入图像解码器的文件,但我没有用Python处理图像了丰富的经验和我在一个总损失就在这里。
您所遇到的问题是,该文件是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
装载16个bpp图像的时间有限 - 它位于提供的链接上。之后必须丢弃最低的8位,但可以使用图像。 – jsbueno 2010-12-23 12:18:39
发现这个期待中的源.../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 - 使用来源卢克
我处理了很多与原始图像,有的在16位和一些在8位灰度。
我发现将原始图像加载到一个numpy数组,然后将其转换为图像通常是可行的。
如果字节顺序有问题,那么在转换为PIL图像对象之前,numpy array.byteswap()命令应该照顾它。
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改变将代替加载的1的2字节:
该代码是从工作读取8位原始图像转换为PIL的程序采取字节原始图像。在第三行中,图像被转换为4字节的整数,因为一些PIL例程似乎对这种类型更好。
所以 - 你在哪里卡住?我看不出为你写解码器的问题,回答你的问题的有效方法。形成您发送的文档链接,可以编写这样的解码器,是的。但我们需要你澄清你的问题。 – jsbueno 2010-12-23 12:18:59