循环遍历限制内的所有RGB组合

时间:2015-04-04 20:42:43

标签: java for-loop colors combinations rgb

我目前使用以下代码循环遍历图像中的像素,并返回像素的坐标,其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值的所有组合?

2 个答案:

答案 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.