我查看pascal voc 2012 dataset的地面实况分割面具。这些是单通道8位uint png文件。但是,当我在文件浏览器(nautilus)或图像查看器(eog)中打开这些图像时,它们会以颜色显示。
它不应该以灰度显示吗?
当我使用Matlab将图像存储为单通道8位uint png文件时,它会按预期以灰度显示。有不同类型的png文件有什么区别?
如何存储它以使我的图像查看器以颜色显示它们?
答案 0 :(得分:2)
您的图像文件包含indexed images,带有M-by-N索引矩阵和P-by-3色图矩阵。你怎么知道?加载图片时,您需要从imread
获取第二个输出:
[img, cmap] = imread('zuIra.png');
if isempty(cmap)
% Process data as a grayscale or RGB image
else
% Process data as an indexed image
end
如果cmap
为空,则您的数据是M-by-N grayscale intensity image或M-by-N-by-3 Truecolor RGB image。否则,您正在处理索引的彩色图像,并且必须在图像的任何处理中使用这两个数据,例如使用imshow
查看它:
imshow(img, cmap);
或者使用imwrite
重新保存数据时:
imwrite(img, cmap, 'outfile.png');
如果您希望处理单个图像数据矩阵(在某些情况下可以使处理更容易),您可以将索引图像数据和关联的色彩映射转换为带有ind2rgb
的RGB图像:
imgRGB = ind2rgb(img, cmap);
答案 1 :(得分:0)
您正在使用1 to 8 bits
处理每个像素PNG的indexed colors
(变量)。
当格式使用此技术时,颜色信息不会直接存储到图像像素数据中,而是存储在称为palette
的单独数据中。 palette
可以定义为预定义的颜色数组,其中每个元素定义特定颜色的三色表示(RGB
)(每个通道8 bits
,总共{{1} }})。
图像像素数据不包含24 bits
形式的颜色的完整规格,而只包含调色板颜色的索引。当然,RGB
必须包含图像中每种像素颜色的一个条目。
这种方法可以看作是一种压缩形式,其中只有一组有限的颜色可用,以节省内存/存储空间并加快图像的显示速度。
长话短说,palette
来电的结果并没有给你返回图片的颜色信息。您的数组包含PNG调色板元素的索引。
示例强>
假设您有n个索引的PNG,其宽度为3像素,高度为1像素。第一个像素是纯红色,第二个像素是纯绿色,第三个像素是纯蓝色。
在PNG二进制数据中,imread
块将包含以下颜色定义:
PLTE
并且[255 0 0] % Pure Red
[0 255 0] % Pure Green
[0 0 255] % Pure Blue
块将使用以下数据定义单个通道:
IHDR