Matlab 颜色量化
Posted
技术标签:
【中文标题】Matlab 颜色量化【英文标题】:Matlab Color Quantization 【发布时间】:2015-11-25 10:40:34 【问题描述】:我目前正在从事与颜色量化相关的项目。该算法暗示为初始步 k-means 算法。到目前为止我的代码:
N = 10;
K=7;
I=imread('baboon.bmp');
Idouble = double(I);
mat=zeros(size(I,1)*size(I,2),size(I,3));
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);
mat(:,1)=R(:);
mat(:,2)=G(:);
mat(:,3)=B(:);
[IDX,CENTERS] = kmeans(mat,N);
算法的下一步是寻找最流行的颜色(图像中包含最多像素的颜色)。这似乎很容易,但当我试图从 IDX
variable 中提取它时,我有点卡住了。
【问题讨论】:
变量Idouble
没用。另外,您可以将最后 8 行与 squeeze
和连接合并为一个。然后,我不明白你的问题:期望的输出是什么?为什么需要 kmeans ? unique (...,.'rows)
还不够吗?
IDX
应该包含[1..k]
集群的索引,用于mat
中的每个点。所以sum(IDX==1)
应该给你集群 1 中的点数,对吧?
@beaker 是的..你是对的..
【参考方案1】:
kmeans
返回存储在CENTERS
中的图像中存在的质心/代表颜色,IDX
为您提供每个像素的成员资格。 CENTERS
的每一行都是一个质心,IDX
告诉您CENTERS
中的哪一行您需要引用图像中的像素在聚类后被分配到。
如果您想找到“最流行的颜色”,我假设您的意思是最最常出现。在这种情况下,将mode
操作应用于您的集群成员向量,然后使用它来索引CENTERS
以获得最受欢迎的集群:
idx_popular = mode(IDX);
popular_colour = CENTERS(idx_popular,:);
小提示
由于kmeans
是一种随机算法,因此您的集群质心很可能在每次迭代时都不同 - 无论它们是完全不同还是相同但顺序不同,都取决于算法。
我建议您运行几次kmeans
算法,以确保您确实以高概率获得最流行的颜色。这可以通过在运行kmeans
时指定Replicates
标志来完成:
num_repeats = 5; %// For example
[IDX,CENTERS] = kmeans(mat, N, 'Replicates', num_repeats);
【讨论】:
谢谢。我也遇到了其他解决方案,但这个似乎更优雅,而且肯定更快。 @AlbertoCarp - 没问题。我很高兴我正确地解释了这个问题。祝你好运!以上是关于Matlab 颜色量化的主要内容,如果未能解决你的问题,请参考以下文章