我正在做一些图像处理,我需要减少图像的颜色数量。我发现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种颜色。
发布于 2014-09-07 00:35:35
从视觉上看,可能有6种以上的颜色,但实际上有6种颜色。如果你看看你的map
变量,它将是一个6x3矩阵。每行包含要量化图像的颜色。
若要进行二次检查,请将此图像转换为灰度图像,然后对该图像进行直方图。如果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种颜色,但它不像它,因为量化噪音的图像。
发布于 2014-09-07 00:40:18
不要怀疑你的结果,该图像包含确切的6种颜色。
正如Matlab文档中所解释的那样, function返回一个索引矩阵(代码中的X
)和一个颜色映射(代码中的map
)。因此,如果您想检查X
中的颜色数,只需检查颜色图:size(map)
的大小即可。
在您的情况下,大小将是6x3
:6种颜色描述在3个渠道(红色,贪婪和蓝色)。
https://stackoverflow.com/questions/25705705
复制相似问题