在一定范围内循环遍历所有 RGB 组合

Looping through all RGB combinations within a limit

我目前正在使用以下代码来遍历图像中的像素,return 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 值变化都非常小,所以我试图向当前恒定的 RGB 值添加一种 "tolerance"。例如,在一种情况下,红色可能是 185,绿色可能是 89,而蓝色可能是相同的 (182)。

我知道我可以在 if 语句中使用 OR (||) 函数定义所有条件,但是因为这需要大量代码,有没有更简单的解决方案?例如,将正公差定义为常量并循环遍历此公差内的 RGB 值的所有组合?

在公差范围内遍历所有颜色排列会非常慢:假设您的公差为 +/- 5,这将需要检查 1331 种不同的颜色 (11 reds * 11 greens * 11 blues)。

只需将您的条件 red == 183 更改为 Math.abs(red - 183) < tolerance(red >= 183 - tolerance || red <= 183 + tolerance) 之类的内容(其他频道也类似),速度会快得多。

与其检查您的值是否明确等于数字列表,您会更乐意检查它们是否在特定范围内。你可以用 (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.