单通道png显示颜色

时间:2017-11-22 15:41:12

标签: matlab png

我查看pascal voc 2012 dataset的地面实况分割面具。这些是单通道8位uint png文件。但是,当我在文件浏览器(nautilus)或图像查看器(eog)中打开这些图像时,它们会以颜色显示。
它不应该以灰度显示吗?
当我使用Matlab将图像存储为单通道8位uint png文件时,它会按预期以灰度显示。有不同类型的png文件有什么区别?
如何存储它以使我的图像查看器以颜色显示它们?

这是原始的单一频道png:
this is the original single channel png

这是imreadimwrite之后的结果。请注意,已添加/删除了NO通道:
this is the result after <code>imread</code> and <code>imwrite</code> NO channel had been added / removed

2 个答案:

答案 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