【问题标题】:Reading raw imagery with PIL and Python使用 PIL 和 Python 读取原始图像
【发布时间】:2013-08-12 01:58:51
【问题描述】:

我有一个从 NASA 获得的 7GB 图像,我想使用 Python 和 PIL 编写一个解码器。我得到图片的页面如下:

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

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

【问题讨论】:

  • 那么 - 你被困在哪里了?除了为您编写解码器之外,我看不出任何有效的方法可以回答您的问题。形成您发送的文档链接,可以编写这样的解码器,是的。但我们需要您澄清您的问题。

标签: python image-processing python-imaging-library


【解决方案1】:

我经常处理原始图像,有些是 16 位的,有些是 8 位灰度的。

我发现将原始图像加载到 numpy 数组中,然后将其转换为图像通常可以。

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

此代码取自将 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 例程似乎更适合这种类型。

【讨论】:

    【解决方案2】:

    您遇到的问题是,当 PIL 在提供的列表中仅支持 8 位像素时,文件为 16 位像素,并且来自同一主题的此邮件中的 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 位,但可以使用图像。
    • 丢弃低 8 位 ... 听起来并不是一个可以接受的解决方案。也许是为了“漂亮的照片”,但……如果这些东西来之不易,扔掉它们不是解决办法。
    【解决方案3】:

    PIL v1.1.7 的来源中的.../Imaging-1.1.7/PIL/Image.py 中找到了这个,请注意末尾关于一些“实验模式”的评论:

    # --------------------------------------------------------------------
    # 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 - 使用源卢克

    【讨论】:

      猜你喜欢
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 2022-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      • 2016-05-21
      相关资源
      最近更新 更多