使用PIL和Python读取原始图像

使用PIL和Python读取原始图像,python,image-processing,python-imaging-library,Python,Image Processing,Python Imaging Library,我从美国宇航局得到了一张7GB的图像,我想用Python和PIL编写一个解码器。我从中获取图像的页面说明如下: 数据的格式为 单通道16位整数(两个 字节,长)有符号原始二进制文件, 具有大端字节顺序且没有 标题 编写图像解码器的文档,但我没有太多的Python处理图像的经验,我在这里完全不知所措。您遇到的问题是,当PIL在提供的列表中仅支持8位像素时,文件是16位像素,而本邮件中关于同一主题的16位little endian: 那是4年前的事了,今年又有同样的话题提出: 在PIL v1.1.

我从美国宇航局得到了一张7GB的图像,我想用Python和PIL编写一个解码器。我从中获取图像的页面说明如下:

数据的格式为 单通道16位整数(两个 字节,长)有符号原始二进制文件, 具有大端字节顺序且没有 标题


编写图像解码器的文档,但我没有太多的Python处理图像的经验,我在这里完全不知所措。

您遇到的问题是,当PIL在提供的列表中仅支持8位像素时,文件是16位像素,而本邮件中关于同一主题的16位little endian:

那是4年前的事了,今年又有同样的话题提出:


PIL v1.1.7
的源代码的
../Imaging-1.1.7/PIL/Image.py
中发现了这一点,请注意结尾关于一些“实验模式”的注释:

看起来它对16位图像有一些支持


UTSL-使用源Luke

我处理很多原始图像,有些是16位的,有些是8位灰度的

我发现将原始图像加载到numpy数组中,然后将其转换为图像通常是有效的

如果字节顺序有问题,则在转换为PIL图像对象之前,numpy array.byteswap()命令应处理该问题

此代码取自将8位原始图像读入PIL的程序:

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将加载2字节而不是1字节的原始图像。在第三行中,图像被转换为4字节整数,因为一些PIL例程似乎更适合这种类型

支持加载16个bpp图像-它位于提供的链接上。之后你必须放弃最低的8位,但你可以处理图像。放弃较低的8位。。。听起来不是一个可以接受的解决方案。也许是为了“漂亮的照片”,但是。。。如果这些东西来之不易,那么把它们扔掉并不是解决办法。那么——你在哪里?除了给你写译码器,我看不出有什么有效的方法来回答你的问题。从您发送的文档链接中,可以编写这样的解码器,是的。但我们需要你澄清你的问题。
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)