我有.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
我希望未更改的索引颜色图像,即包含值1024x1024
或0
的图像1
。不过,我收到的值为1024x1024
或0
的{{1}}图片。
我很困惑181
的来源(不是相应颜色值的平均值; 181
),我也不想手动更改这些值。 有没有办法用Python OpenCV(或者如果需要其他库)读取颜色索引的tiff文件到[a]获取索引图像和(可选)[b]甚至获取颜色图?
示例文件是here。用MATLAB读取这些数据按预期工作:
(140 + 215 + 115) / 3 = 157
答案 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}的0
或1
,因此您需要对其进行标准化或对比度拉伸如果你想看到任何东西:
convert indices.pgm -normalize result.jpg
请注意,如果您使用 ImageMagick v7 +,identify
变为magick identify
而convert
在上述命令中变为magick
。