使用rgb2ind减少matlab中的颜色数量

时间:2014-09-06 23:29:54

标签: matlab image-processing colors

我正在做一些图像处理,我需要减少图像的颜色数量。我发现rgb2ind可以做到并编写以下代码段:

clc
clear all
[X,map] = rgb2ind(RGB,6,'nodither');
X = rgb2ind(RGB, map);
rgb=ind2rgb(X,map);
rgb_uint8=uint8(rgb*255+0.5);
imshow(rgb_uint8);

但输出看起来像这样,我怀疑其中只有6种颜色。

enter image description here

2 个答案:

答案 0 :(得分:5)

它可能在感觉上看起来有超过6种颜色,但确实有6种颜色。如果您查看map变量,它将是一个6 x 3矩阵。每行包含您要将图像量化为的颜色。

要仔细检查,请将此图像转换为灰度图像,然后对此图像执行直方图。如果rgb2ind有效,您应该只在柱状图中看到6个尖峰。

顺便说一句,为了能够重建您的问题,您使用了内置于MATLAB系统路径的peppers.png图像。因此,我就是这样描述我所说的:

RGB = imread('peppers.png');

%// Your code
[X,map] = rgb2ind(RGB,6,'nodither');
X = rgb2ind(RGB, map);
rgb=ind2rgb(X,map);
rgb_uint8=uint8(rgb*255+0.5);
imshow(rgb_uint8);

%// My code - Double check colour distribution
figure;
imhist(rgb2gray(rgb_uint8));
axis tight;

这是我得到的数字:

enter image description here

如您所见,我们的直方图中有6个峰值。如果在运行代码时确实有6种独特的颜色,那么当您将图像转换为灰度时,应该有相当于6个等效的灰度强度,上面的直方图验证了我们的发现。

因此,您将图像量化为6种颜色,但由于图像的量化噪声,它看起来并不像。

答案 1 :(得分:0)

不要怀疑你的结果,图片中只包含6种颜色。

如Matlab文档中所述,rgb2ind function会在代码中返回索引矩阵(X)和代码中的色彩映射(map)。因此,如果您想检查X中的颜色数量,只需检查色彩映射的大小:size(map)

在您的情况下,尺寸为6x3:在3个通道上描述6种颜色(红色,贪婪和蓝色)。