限制

2015-04-04 19 views
0

內通過所有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值每次在應用程序中都會有微小的變化,所以我試圖給當前常量的RGB值添加一種「容差」。例如,紅色可能是185,綠色可能是89,藍色可能是相同的(182)。

我明白我可以在if語句中使用OR(||)函數來定義所有的條件,但是因爲這需要很多代碼,所以有更簡單的解決方案嗎?例如,將正公差定義爲常量,並在該公差範圍內循環RGB值的所有組合?

+0

'如果(Math.abs (red - 183) 2015-04-04 20:44:07

+0

轉換爲HSV會更有意義嗎?飽和度大致相同,或者至少可以忽略我想轉換會很慢。 – clearlight 2015-04-04 20:51:00

回答

0

在公差範圍內循環顏色的所有排列將會非常緩慢:假設您的公差爲+/- 5,這將需要檢查1331種不同的顏色(11 reds * 11 greens * 11 blues)。

將您的狀況red == 183更改爲類似Math.abs(red - 183) < tolerance(red >= 183 - tolerance || red <= 183 + tolerance)(對於其他頻道也是如此)的速度要快得多。

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.