【问题标题】:Determine red and orange colors in an array Java确定数组Java中的红色和橙色
【发布时间】:2023-03-29 22:21:02
【问题描述】:

我有一个包含 24 种颜色的数组。我想做的是把红色和橙色分开,这样它们的颜色就不会那么接近了。我有 4 种“红色”颜色和 4 种“橙色”颜色。我注意到的是,红色的 G 值和 B 值总是比橙色的高。所以我想要做的是遍历颜色数组并根据它的 RGB 值确定它是红色还是橙色并将其分配给Color.ORANGEColor.RED

for(int i = 0; i < colorArray.length; i++){
        if(colorArray[i].getRed() == 255 && colorArray[i].getGreen() <= 20 && colorArray[i].getBlue() <= 20){
            colorArray[i] = Color.RED;
        }
        if(colorArray[i].getRed() == 255 && colorArray[i].getGreen() >= 21 && colorArray[i].getBlue() <= 21){
            colorArray[i] = Color.ORANGE;
        }
    }

问题在于红色的 getGreengetBlue 并不总是低于 20,它可能是感知到的“红色”颜色中有更多的绿色,但是它的绿色和蓝色值将始终小于橙色的值。我怎样才能改变它以使其使用这种逻辑? 这是一个带有颜色的示例数组。

Color Array: [java.awt.Color[r=197,g=255,b=106], java.awt.Color[r=197,g=255,b=106], java.awt.Color[r=0,g=0,b=255], java.awt.Color[r=255,g=25,b=61], java.awt.Color[r=255,g=97,b=112], java.awt.Color[r=255,g=39,b=67], java.awt.Color[r=51,g=255,b=114], java.awt.Color[r=255,g=108,b=113], java.awt.Color[r=197,g=255,b=106], java.awt.Color[r=0,g=0,b=255], java.awt.Color[r=254,g=231,b=255], java.awt.Color[r=254,g=231,b=255], java.awt.Color[r=254,g=231,b=255], java.awt.Color[r=255,g=79,b=45], java.awt.Color[r=255,g=85,b=51], java.awt.Color[r=197,g=255,b=106], java.awt.Color[r=0,g=0,b=255], java.awt.Color[r=51,g=255,b=114], java.awt.Color[r=51,g=255,b=114], java.awt.Color[r=255,g=39,b=67], java.awt.Color[r=51,g=255,b=114], java.awt.Color[r=0,g=0,b=255], java.awt.Color[r=254,g=231,b=255], java.awt.Color[r=255,g=39,b=67]]

【问题讨论】:

  • 你能按 B+G 的总量排序吗?
  • 不,我不想对数组进行排序。它的顺序对我正在使用的东西很重要。 @OliverCharlesworth
  • 我的意思是对它们进行排序纯粹是为了分类。你不必坚持这个顺序。
  • 如果可以做到那没关系,但是我需要恢复原来的顺序。
  • 在你的 if 语句中为什么不做 if(colorArray[i].getRed() == 255 &amp;&amp; colorArray[i].getGreen() + colorArray[i].getBlue() &lt;= 80)if(colorArray[i].getRed() == 255 &amp;&amp; colorArray[i].getGreen() + colorArray[i].getBlue() &lt;= 200) 当然你可以改变这些值,但它们对我来说似乎很好。但高于 200 则更像黄色而不是橙色

标签: java arrays colors


【解决方案1】:

如果您尝试根据颜色是否更接近红色而不是接近橙色来对颜色进行分组,请尝试在颜色空间内使用欧几里德距离公式。该公式类似于笛卡尔平面中的距离公式,只是增加了 z 值。

sqrt((r2 - r1)^2 + (g2 - g1)^2 + (b2 - b1)^2)

比较红色(255,0,0)和橙色(255,165,0)的距离

【讨论】:

  • 感谢您的建议,但我已经尝试过了。我的橙色和红色非常接近实际的红色。我发现如果我可以根据它们的值确定使用第二和第三通道从橙色中确定红色的方法会更好。
  • 数学不会说谎,这是确定颜色是否更接近红色或橙色的公式。如果这是一个感知问题,那不是您可以通过编程方式解决的问题。
  • 我知道你的意思。我已经用它和其他颜色做了这个,但我需要更多的东西。 finalStore[0] = (int) colorDistance(colorArray[i], new Color(255, 255, 255)); //white finalStore[1] = (int) colorDistance(colorArray[i], new Color(255,50,50)); //orange finalStore[2] = (int) colorDistance(colorArray[i], new Color(80, 255, 70)); //green finalStore[3] = (int) colorDistance(colorArray[i], new Color(255, 0, 0)); //red finalStore[4] = (int) colorDistance(colorArray[i], Color.BLUE); finalStore[5] = (int) colorDistance(colorArray[i], new Color(255,255,0)); //yellow
猜你喜欢
  • 2016-10-01
  • 2021-09-20
  • 2014-02-23
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 2019-01-10
  • 2014-11-04
  • 1970-01-01
相关资源
最近更新 更多