使用Python OpenCV读取颜色索引的.tiff文件

时间:2018-03-04 20:16:33

标签: python opencv tiff

我有.tiff files containing color-indexed images,即图像本身(1024x1024)包含每个像素的索引(在我的情况下为0,1),而在tiff文件中是将这些代码映射到颜色的色彩图(256x3)

code    R   G   B
_________________
0 =     0   0   0
1 =     140 215 115
2 =     255 255 255 ... (other codes are irrelevant for me)

我想用Python阅读索引图像。我正在使用OpenCV并关注the docs我试过这个(不使用-1标志给出RGB图像):

img = cv2.imread(file, cv2.IMREAD_UNCHANGED)     # cv2.IMREAD_UNCHANGED = -1

我希望未更改的索引颜色图像,即包含值1024x10240的图像1。不过,我收到的值为1024x10240的{​​{1}}图片。

我很困惑181的来源(不是相应颜色值的平均值; 181),我也不想手动更改这些值。 有没有办法用Python OpenCV(或者如果需要其他库)读取颜色索引的tiff文件到[a]获取索引图像和(可选)[b]甚至获取颜色图?

示例文件是here。用MATLAB读取这些数据按预期工作:

(140 + 215 + 115) / 3 = 157

1 个答案:

答案 0 :(得分:1)

更新了答案

似乎Pillow也可以从你的TIFF中提取调色板。我不是Python专家,但我写了这个并且似乎有效:

from PIL import Image

image = Image.open('indexed.tif')
print(image.getpalette()[:12])

<强>输出

[0, 0, 0, 140, 215, 115, 255, 255, 255, 0, 0, 0]

原始答案

您可以使用 ImageMagick 在命令行中轻松完成您的要求,该驱动程序安装在大多数Linux发行版上,可用于macOS和Windows。

首先回答最后一部分,您可以使用以下命令提取调色板:

identify -verbose indexed.tif

示例输出

Image: indexed.tif
  Format: TIFF (Tagged Image File Format)
  Mime type: image/tiff
  Class: PseudoClass
  Geometry: 1024x1024+0+0
  Resolution: 72x72
  Print size: 14.2222x14.2222
  Units: PixelsPerInch
  Colorspace: sRGB
  Type: Palette
  Endianess: LSB
  Depth: 8-bit
  Channel depth:
    Red: 8-bit
    Green: 8-bit
    Blue: 8-bit
  Channel statistics:
    Pixels: 1048576
    Red:
      min: 0  (0)
      max: 140 (0.54902)
      mean: 24.9271 (0.0977535)
      standard deviation: 53.5578 (0.210031)
      kurtosis: 0.832982
      skewness: 1.68315
      entropy: 0.675795
    Green:
      min: 0  (0)
      max: 215 (0.843137)
      mean: 38.281 (0.150121)
      standard deviation: 82.2495 (0.322547)
      kurtosis: 0.832982
      skewness: 1.68315
      entropy: 0.675795
    Blue:
      min: 0  (0)
      max: 115 (0.45098)
      mean: 20.4759 (0.0802975)
      standard deviation: 43.9939 (0.172525)
      kurtosis: 0.832982
      skewness: 1.68315
      entropy: 0.675795
  Image statistics:
    Overall:
      min: 0  (0)
      max: 215 (0.843137)
      mean: 27.8947 (0.109391)
      standard deviation: 59.9337 (0.235034)
      kurtosis: 2.61693
      skewness: 2.01681
      entropy: 0.675795
  Colors: 2
  Histogram:
    861876: (  0,  0,  0) #000000 black
    186700: (140,215,115) #8CD773 srgb(140,215,115)
  Colormap entries: 256
  Colormap:
         0: (  0,  0,  0,255) #000000FF black
         1: (140,215,115,255) #8CD773FF srgba(140,215,115,1)
         2: (255,255,255,255) #FFFFFFFF white
         3: (  0,  0,  0,255) #000000FF black
         4: (  0,  0,  0,255) #000000FF black
         5: (  0,  0,  0,255) #000000FF black
         6: (  0,  0,  0,255) #000000FF black
         7: (  0,  0,  0,255) #000000FF black
         8: (  0,  0,  0,255) #000000FF black
         ...
         ...

您可以在上面的最后8行中看到您的调色板(色彩映射)。更方便的命令是:

identify -verbose indexed.tif | grep -A8 "Colormap:"
  Colormap:
     0: (  0,  0,  0,255) #000000FF black
     1: (140,215,115,255) #8CD773FF srgba(140,215,115,1)
     2: (255,255,255,255) #FFFFFFFF white
     3: (  0,  0,  0,255) #000000FF black
     4: (  0,  0,  0,255) #000000FF black
     5: (  0,  0,  0,255) #000000FF black
     6: (  0,  0,  0,255) #000000FF black
     7: (  0,  0,  0,255) #000000FF black

现在问题的第一部分。获取黑色和其他颜色的零图像的最简单方法是将填充颜色设置为一个( ImageMagick 调用gray(1)),然后将所有不是黑色的内容设置为进入那种颜色。最后,保存为一个PGM(Portable GreyMap)文件,OpenCV可以在没有任何库的情况下读取该文件,并且不能包含调色板,因此它无法让您烦恼:

convert indexed.tif -fill "gray(1)" +opaque black indices.pgm

这是实际答案的结束。以下所有内容仅仅是额外的信息。

请注意,这是一张非常暗的低对比度图像,因为它只包含{2}的01,因此您需要对其进行标准化或对比度拉伸如果你想看到任何东西:

convert indices.pgm -normalize result.jpg

enter image description here

请注意,如果您使用 ImageMagick v7 +,identify变为magick identifyconvert在上述命令中变为magick