比较像素颜色 - Java

时间:2011-02-21 13:19:36

标签: java colors pixel pixels

如何使用颜色对象找到相似的彩色像素?我知道你可以使用两种颜色是否相同:

a.equals(B);

其中a和b是颜色对象,但是如果我想找到类似的蓝色阴影呢?

3 个答案:

答案 0 :(得分:4)

比较颜色为not a trivial problem,有各种不同的指标。 我找不到一个(很容易)这样做的图书馆,但如果你有彻底的搜索,我肯定会有一些东西 Have a look at this class。在此期间do some reading!

答案 1 :(得分:4)

当以编程方式调整颜色值时,您有很多选择。一个非常简单的解决方案是简单地随机偏移颜色对象的通道值。把它想象成变异的颜色 - 只需要改变你想变异的颜色并从中生成更多颜色:

Color mutateColor(int range){
  int r = a.getRed() + (int)(Math.random() * 2 * range - range);
  r = Math.min(255, Math.max(0, r));

  int g = a.getGreen() + (int)(Math.random() * 2 * range - range);
  g = Math.min(255, Math.max(0, g));

  int b = a.getBlue() + (int)(Math.random() * 2 * range - range);
  b = Math.min(255, Math.max(0, b));

  return new Color(r, g, b);
}

这是最简单的例子,给出了一个范围,每个通道都被相同的范围偏移,结果是这样的:

a few randomly colored boxes

这是使用范围值10完成的。对于添加的控件,您可以向mutateColor函数添加三个参数(每个单独通道的偏移量)。您也可以使用一个范围,但可以根据通道中已有的值对其进行更改。例如:

range = 0.25
red = 100
green = 10
blue = 0

redRange = 100 + rand(-25, 25)
greenRange = 10 + rand(-2.5, 2.5);
etc...

这只是众多其他可能性中的一种。

如果您希望将两种颜色与公差进行比较,我会从fredley的链接中移植代码,它可以很好地获取两种颜色之间的区别:

double colorDist(Color e1, Color e2){
  long rmean = ( (long)e1.getRed() + (long)e2.getRed() ) / 2;
  long r = (long)e1.getRed() - (long)e2.getRed();
  long g = (long)e1.getGreen() - (long)e2.getGreen();
  long b = (long)e1.getBlue() - (long)e2.getBlue();
  return Math.sqrt((((512+rmean)*r*r)>>8) + 4*g*g + (((767-rmean)*b*b)>>8));
}

答案 2 :(得分:1)

  

如果我想找到类似的蓝色阴影怎么办?

我不知道这可能意味着什么技术定义。但是,您可以使用HSL Color创建自己的定义。

基本上,我猜你可以从确保每种颜色的色调是+/-固定的度数开始。然后,您可以通过检查饱和度和/或亮度是否在您想要的范围内来进一步缩小范围。