2010-12-23 106 views
1

我有一张从NASA获得的7GB图像,我想用Python和PIL编写一个解码器。从那里我得到的图像的页面出现如下提示:用PIL和Python读取原始图像

的数据被格式化为 单通道16位整数(二 字节,长)与大端签署原始的二进制文件, 字节顺序并且没有 标题。

Here's用于写入图像解码器的文件,但我没有用Python处理图像了丰富的经验和我在一个总损失就在这里。

+0

所以 - 你在哪里卡住?我看不出为你写解码器的问题,回答你的问题的有效方法。形成您发送的文档链接,可以编写这样的解码器,是的。但我们需要你澄清你的问题。 – jsbueno 2010-12-23 12:18:59

回答

0

您所遇到的问题是,该文件是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

+0

装载16个bpp图像的时间有限 - 它位于提供的链接上。之后必须丢弃最低的8位,但可以使用图像。 – jsbueno 2010-12-23 12:18:39

0

发现这个期待中的源.../Imaging-1.1.7/PIL/Image.pyPIL 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 - 使用来源卢克

2

我处理了很多与原始图像,有的在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例程似乎对这种类型更好。