在Python中读入索引的彩色图像

Dzu*_*yen 6 python matlab image image-processing

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

[im, colormap] = imread('indexed.png');
Run Code Online (Sandbox Code Playgroud)

我怎样才能在Python中做同样的事情?我尝试过OpenCV,scikit-image但它们都会自动转换为RGB.

ray*_*ica 7

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

安装包,然后您可以使用类中的Image.open方法Image打开图像.如果您的图像具有颜色贴图,则图像将自动作为索引图像加载.要使其可用,请使用NumPy并使用numpy.array构造函数.我假设您可以使用NumPy,因为scikit-imageOpenCV都使用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
Run Code Online (Sandbox Code Playgroud)

最后,如果您想要实际用于图像的颜色贴图/调色板,请使用该类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
Run Code Online (Sandbox Code Playgroud)

为了证明我们有这个正确,这是我刚才帮助解决的一个问题的索引图像:

使用MATLAB加载此图像:

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

当我将索引图像中的行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
Run Code Online (Sandbox Code Playgroud)

这是我在运行等效代码获取索引图像时在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)
Run Code Online (Sandbox Code Playgroud)

那匹配......现在彩色地图怎么样?我们来看看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
Run Code Online (Sandbox Code Playgroud)

蟒蛇

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]])
Run Code Online (Sandbox Code Playgroud)

......看起来很匹配!