【问题标题】:Read in an indexed color image in Python在 Python 中读入索引彩色图像
【发布时间】:2016-01-06 12:00:21
【问题描述】:

索引彩色图像是具有整数 (1,2, .. N) 像素的图像,对于每个整数,关联的颜色从给定的颜色映射映射到该像素。在 MATLAB 中,可以通过以下方式读取索引的彩色图像:

[im, colormap] = imread('indexed.png');

如何在 Python 中做同样的事情?我尝试过 OpenCV,scikit-image,但它们都自动转换为 RGB。

【问题讨论】:

    标签: python image matlab image-processing


    【解决方案1】:

    经过一番研究,这就是我想出的。您可以使用Python Imaging Library - 特别是枕头叉:https://python-pillow.github.io/

    安装包,然后你可以使用Image类中的Image.open方法打开镜像。如果您的图像有颜色图,则图像将自动加载作为索引图像。要使其可用,请使用 NumPy 并使用 numpy.array 构造函数。我假设您可以使用 NumPy,因为 scikit-image 和 OpenCV 都使用 NumPy 作为图像处理的基础:

    from PIL import Image
    import numpy as np
    im = Image.open("image.png") # Replace with your image name here
    indexed = np.array(im) # Convert to NumPy array to easier access
    

    最后,如果您想要实际用于图像的颜色映射/调色板,请使用Image.getpalette 方法,它是Image 类的一部分。但是,这会给你一个num_colours x 3 元素列表。因此,要确定您有多少种颜色,只需将此列表的长度除以 3。但是,在 MATLAB 中加载的颜色图是规范化,而getpalette 不会对此进行规范化,默认为加载图像的类型。因此,您必须通过查看转换后的 NumPy 图像版本来推断图像类型是什么,然后使用它来标准化您的颜色图:

    这样:

    # Get the colour palette
    palette = im.getpalette()
    
    # Determine the total number of colours
    num_colours = len(palette)/3
    
    # Determine maximum value of the image data type
    max_val = float(np.iinfo(indexed.dtype).max)
    
    # Create a colour map matrix
    map = np.array(palette).reshape(num_colours, 3) / max_val
    

    为了证明我们的判断是正确的,这里有一个索引图像from a question that I helped solve a while ago

    使用 MATLAB 加载此图像:

    [indexed, map] = imread('http://i.stack.imgur.com/OxFwB.png');
    

    当我关注索引图像中的第 280 到 290 行和第 400 到 410 列作为双重检查时,我得到了这个:

    >> indexed(280:290, 400:410)
    
    ans =
    
       59   60   61   62   65   64   59   56   56   53   49
       61   61   64   65   65   60   60   57   58   53   53
       67   62   67   56   60   62   60   61   51   59   55
       65   60   62   61   58   58   53   55   57   55   54
       66   58   56   59   56   56   52   55   52   55   52
       68   68   61   61   61   56   56   55   55   57   59
       66   59   59   66   68   62   62   60   60   60   53
       70   68   64   58   61   63   67   61   67   56   59
       69   67   63   64   62   65   63   68   67   64   58
       61   68   68   72   71   73   70   66   63   64   64
       68   67   70   71   71   69   64   64   65   64   58
    

    这是我在 Python 中运行等效代码以获取索引图像时得到的结果。请注意,我将图像物理下载到我的计算机上并从磁盘加载它。请注意,NumPy 从 0 而不是 1 开始索引,因此我必须将范围减 1。还要注意范围运算符的结尾是 独占

    In [29]: indexed[279:290, 399:410]
    Out[29]: 
    array([[59, 60, 61, 62, 65, 64, 59, 56, 56, 53, 49],
           [61, 61, 64, 65, 65, 60, 60, 57, 58, 53, 53],
           [67, 62, 67, 56, 60, 62, 60, 61, 51, 59, 55],
           [65, 60, 62, 61, 58, 58, 53, 55, 57, 55, 54],
           [66, 58, 56, 59, 56, 56, 52, 55, 52, 55, 52],
           [68, 68, 61, 61, 61, 56, 56, 55, 55, 57, 59],
           [66, 59, 59, 66, 68, 62, 62, 60, 60, 60, 53],
           [70, 68, 64, 58, 61, 63, 67, 61, 67, 56, 59],
           [69, 67, 63, 64, 62, 65, 63, 68, 67, 64, 58],
           [61, 68, 68, 72, 71, 73, 70, 66, 63, 64, 64],
           [68, 67, 70, 71, 71, 69, 64, 64, 65, 64, 58]], dtype=uint8)
    

    匹配...现在颜色图呢?我们来看看MATLAB和Python之间颜色映射的前10行:

    MATLAB

    >> format long g;
    >> map(1:10,:)
    
    ans =
    
                             0                         0                         0
            0.0156862745098039       0.00392156862745098        0.0274509803921569
            0.0313725490196078       0.00784313725490196        0.0588235294117647
            0.0470588235294118        0.0117647058823529        0.0901960784313725
            0.0627450980392157        0.0156862745098039          0.12156862745098
            0.0784313725490196        0.0196078431372549         0.152941176470588
            0.0941176470588235        0.0235294117647059         0.184313725490196
             0.109803921568627        0.0274509803921569         0.215686274509804
             0.125490196078431        0.0313725490196078         0.247058823529412
             0.141176470588235        0.0352941176470588          0.27843137254902
    

    Python

    In [30]: map[:10,:]
    Out[30]: 
    array([[ 0.        ,  0.        ,  0.        ],
           [ 0.01568627,  0.00392157,  0.02745098],
           [ 0.03137255,  0.00784314,  0.05882353],
           [ 0.04705882,  0.01176471,  0.09019608],
           [ 0.0627451 ,  0.01568627,  0.12156863],
           [ 0.07843137,  0.01960784,  0.15294118],
           [ 0.09411765,  0.02352941,  0.18431373],
           [ 0.10980392,  0.02745098,  0.21568627],
           [ 0.1254902 ,  0.03137255,  0.24705882],
           [ 0.14117647,  0.03529412,  0.27843137]])
    

    ...看起来很匹配!

    【讨论】:

      猜你喜欢
      • 2019-07-21
      • 1970-01-01
      • 2018-07-17
      • 2011-07-10
      • 2015-11-07
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 2017-12-03
      相关资源
      最近更新 更多