我正在做一些图像处理,我需要减少图像的颜色数量。我发现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种颜色。
答案 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;
这是我得到的数字:
如您所见,我们的直方图中有6个峰值。如果在运行代码时确实有6种独特的颜色,那么当您将图像转换为灰度时,应该有相当于6个等效的灰度强度,上面的直方图验证了我们的发现。
因此,您将图像量化为6种颜色,但由于图像的量化噪声,它看起来并不像。
答案 1 :(得分:0)
不要怀疑你的结果,图片中只包含6种颜色。
如Matlab文档中所述,rgb2ind
function会在代码中返回索引矩阵(X
)和代码中的色彩映射(map
)。因此,如果您想检查X
中的颜色数量,只需检查色彩映射的大小:size(map)
在您的情况下,尺寸为6x3
:在3个通道上描述6种颜色(红色,贪婪和蓝色)。