【问题标题】:sorting colors in matlabmatlab中的颜色排序
【发布时间】:2011-01-15 19:03:22
【问题描述】:

我在 260000 * 3 维数组中有不同的 RGB 值。我想按升序或降序对这些颜色进行排序(哪个都没有关系),以便相似的颜色更接近。最有效的方法是什么?

【问题讨论】:

  • 那么相似的颜色在哪些方面接近呢?颜色是一个三维属性。您必须选择颜色的哪个方面对您很重要。您可以对其中一个通道的代码值进行排序。或者,也许您可​​能希望将这些颜色转换为不同的颜色空间。是你关心的色相角吗?是颜色的轻薄吗?色度?

标签: matlab sorting colors rgb


【解决方案1】:

示例:

首先我们从常规的 Jet 颜色图开始:

%# 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)

首先我们洗牌。然后我们尝试恢复原始的颜色分组(我们通过根据色调和值在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)

【讨论】:

    【解决方案2】:

    内在的sortrows() 函数可能听起来很滑稽——如果不是,请告诉我们。但是您真正的困难在于尝试使用 RGB 三元组来定义颜色的接近度—— [255,254,255] 是否“接近” [255,255,0]?

    PS 在您发表评论之前,我假设您的数据表包含 260000 行,每行包含 3 个数字,代表颜色的 RGB 分量。换句话说,您有一张包含 260000 种颜色的表格。如果这不正确,您能否进一步说明

    【讨论】:

    • 这不起作用,因为排序仅在颜色的三个维度之一中完成。我可以根据第一个排序的向量进一步拆分数组,然后对它们进行进一步排序,最后将所有内容连接在一起,但这似乎效率太低。我正在考虑将三个维度转换为字符串,将它们连接起来,然后将所有内容转换回一维数组中的数字,对它们进行排序,然后将结果拆分回三个维度。我认为这会奏效。你知道如何在matlab中将一个字符串拆分成三个子字符串吗?
    • @podunk,您可以像索引数字数组一样使用冒号运算符来索引字符串。
    • 此外,排序行一次可以对多列进行排序。您可以指定 sortrows(A,[1 3 2]) 先按第 1 列,然后按第 3 列等对 A 进行排序。
    【解决方案3】:

    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 的问题在于它会破坏颜色,例如 sort([23 45 56;24 32 12]) 将返回 [23 32 12;24 45 56] .投反对票。
    • 比你的解决方案多出两行代码让我的工作答案被否决?
    猜你喜欢
    • 1970-01-01
    • 2010-11-18
    • 2014-11-07
    • 2013-04-16
    • 2012-01-24
    • 1970-01-01
    • 2016-10-23
    • 2011-11-29
    • 2018-04-27
    相关资源
    最近更新 更多