在一定范围内循环遍历所有 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.
我目前正在使用以下代码来遍历图像中的像素,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.