我目前使用以下代码循环遍历图像中的像素,并返回像素的坐标,其RGB值与if语句中定义的相同:
outerloop:
for (int y = 0; y < image.getHeight(); y = y + 1) {
for (int x = 0; x < image.getWidth(); x = x + 1) {
Color mycolor = new Color(image.getRGB(x, y));
int red = mycolor.getRed();
int green = mycolor.getGreen();
int blue = mycolor.getBlue();
if (red == 183 & green == 86 & blue == 182){
System.out.println(x,y);
break outerloop;
}
}
}
现在的问题是每次在应用程序中RGB值变化很小,所以我试图添加一种&#34;容差&#34;到目前恒定的RGB值。例如,在一种情况下,红色可以是185,绿色可以是89,蓝色可以是相同的(182)。
我理解我可以使用if语句中的OR(||)函数来定义所有条件,但是这需要很多代码才有更简单的解决方案?例如,将正公差定义为常数并在此公差范围内循环RGB值的所有组合?
答案 0 :(得分:0)
在容差范围内遍历所有颜色的排列将非常缓慢:假设你有+/- 5
的容差,需要检查1331种不同的颜色(11 reds * 11 greens * 11 blues
)。
将条件red == 183
更改为Math.abs(red - 183) < tolerance
或(red >= 183 - tolerance || red <= 183 + tolerance)
(类似于其他渠道)会更快。
答案 1 :(得分:0)
不要检查您的值是否明确等于数字列表,而是更高兴检查它们是否在某个范围内。您可以使用类似(180<x & x<185)
的内容执行此操作,但使用绝对值会更清晰一些:
int TOLERANCE = 3;
boolean in_range(int value, int setpt) {
return abs(value-setpt) <= TOLERANCE;
}
然后在你的循环中,你的条件看起来像:
int R_SETPT = 183;
int G_SETPT = 86;
int B_SETPT = 182;
if (in_range(red, R_SETPT) &
in_range(green, G_SETPT) &
in_range(blue, B_SETPT)) {
// etc.