在Matlab中对颜色进行排序

4

我有一个260000 * 3维度的数组,其中包含不同的RGB值。我想按升序或降序(无所谓)对这些颜色进行排序,以使相似的颜色更接近。最有效的方法是什么?


4
相似的颜色在何方面接近?颜色是一个三维属性。你需要选择颜色中重要的方面。你可以根据通道之一的代码值进行排序。或者,也许你希望将这些颜色转换为不同的颜色空间。你关心的是色调角度吗?还是颜色的亮度?还是色度? - user85109
3个回答

8

范例:

首先,我们从常规的喷气式色图开始:

%# sample image mapped to Jet colormap
I = repmat(1:100, 100, 1);
C = jet(100);

figure
subplot(211), imagesc(I), colormap(C)
subplot(212), rgbplot(C)

original_colormap

首先,我们对颜色进行洗牌。然后,我们尝试恢复颜色的原始分组(通过在HSV颜色空间中根据色调和亮度进行排序来实现):

%# shuffle colors
C = C(randperm(100), :);

%# rearrage according to HSV colorspace
C = rgb2hsv(C);
C = sortrows(C, [-1 -3 2]);  %# sort first by Hue, then by value
C = hsv2rgb(C);

figure
subplot(211), imagesc(I), colormap(C)
subplot(212), rgbplot(C)

recovered_colormap


-2

sort 命令是一个不错的起点。你应该能够按照第一维、第二维、第三维进行排序。我对 RGB 值不是很熟悉,所以我不确定单独排序维度是否会导致匹配的颜色被分组在一起,但是对上述过程进行某种形式的调整应该可以解决问题。

编辑:包括排序索引将避免分离 RGB 颜色。例如:

x=[5,6;4,7;3,8;2,9;1,10];
[x1,index]=sort(x(:,1));
x2=x(index,2);
x=[x1 x2];

sortrows 命令可能更加优雅,但我之前并不知道它。HPM 在这方面是正确的。


使用您建议的排序方法的问题在于它会打乱颜色的顺序,例如sort([23 45 56;24 32 12])将返回[23 32 12;24 45 56]。我要点踩。 - High Performance Mark
1
你的解决方案比我的多两行代码,就让我的可行答案受到了负面评价? - Doresoom

-2

冒昧地说,内在的sortrows()函数可能已经足够了——如果不是,请告诉我们。但你真正的困难在于尝试使用RGB三元组来定义颜色的相似度——[255,254,255]是否“接近”[255,255,0]?

附言:在你的评论之前,我认为你的数据表包含260000行,每行包含3个数字,表示你的颜色的RGB分量。换句话说,你有一个包含260000种颜色的表格。如果这不正确,请进一步说明。


这不起作用是因为排序仅在颜色的三个维度中的一个维度上完成。我可以根据第一个排序向量进一步拆分数组,然后进一步对其进行排序,最后将所有内容合并在一起,但这似乎效率太低。我正在考虑将三个维度转换为字符串,连接它们,然后将所有内容转换回数字形式的单个维度数组,对其进行排序,然后将结果拆分回三个维度。我认为那会起作用。你知道如何在Matlab中将字符串拆分成三个子字符串吗? - podunk
@podunk,您可以使用冒号运算符对字符串进行与数值数组相同的索引。 - Doresoom
另外,sortrows可以同时对多列进行排序。您可以指定sortrows(A,[1 3 2])来首先按列1,然后按列3等对A进行排序。 - Doresoom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接