2014-03-04 128 views
3

我期待在Java中實現一個讀取圖像的功能,並能夠檢測出紅色,藍色,綠色,黃色等陰影作爲衛星圖像分析程序的一部分。因此,例如在標準的衛星圖像中,藍色是水,所以我希望程序能夠讀取多少像素是藍色的,然後可以說圖像的x%是水。Java顏色檢測

我知道這將有可能通過讀取每個像素的RGB值使用整個邏輯語句的負載,但有沒有更容易的方法來做到這一點?否則,將會有數百條if語句需要很長時間才能寫入,而且需要很長時間才能完成。理想的情況是ID喜歡這樣的事情:

if (pixelValue = red) { 
    redCounter++; 
} 

這顯然是很簡單,但它會節省不必通過紅,藍,綠,黃,紫的每一個可能的RGB組合,等等這是目前所有顏色在一些彩色圖像中。

在此先感謝。

+0

也許這可以幫助:http://stackoverflow.com/questions/6524196/java-get-pixel-array-from-image – Frakcool

+0

我知道如何爲每個像素使用'getRGB','getRed'等因爲我在其中一種算法中使用了這個,但是id必須將每個可能的RGB組合的紅色變量定義爲「red」變量。 – user2517280

回答

13

無論如何你必須閱讀每一個像素。你可以用

int rgb = bufferedImage.getRGB(x,y); 

做到這一點或者,您也可以從圖像獲取的數據緩衝和直接獲得的像素爲int[]陣列(如在評論中所述),但要注意,這可能對一些影響之後渲染此圖像時的性能。

下一步將檢測像素是否具有某種顏色。當涉及到的照片,像

if (rgb == Color.BLUE.getRGB()) { ... } 

的比較是沒有意義的:像素不會完美藍色在大多數情況下。相反,您可以通過將RGB值轉換爲HSB顏色空間來分析RGB值的色調。所以,你可以不喜歡

float hsb[] = new float[3]; 
int r = (rgb >> 16) & 0xFF; 
int g = (rgb >> 8) & 0xFF; 
int b = (rgb  ) & 0xFF; 
Color.RGBtoHSB(r, g, b, hsb); 

然後hsb數組將包含顏色的色調,飽和度和亮度。這些0和1的色調乘以360之間將是的值將會給你的顏色的「色調」:

HSV

的飽和度和亮度可被用於檢測是「接近黑色」像素或「接近白色」。 (!),因此,最終的分析,可以大致是這樣的:

if  (hsb[1] < 0.1 && hsb[2] > 0.9) nearlyWhite(); 
else if (hsb[2] < 0.1) nearlyBlack(); 
else { 
    float deg = hsb[0]*360; 
    if  (deg >= 0 && deg < 30) red(); 
    else if (deg >= 30 && deg < 90) yellow(); 
    else if (deg >= 90 && deg < 150) green(); 
    else if (deg >= 150 && deg < 210) cyan(); 
    else if (deg >= 210 && deg < 270) blue(); 
    else if (deg >= 270 && deg < 330) magenta(); 
    else red(); 
} 

這些嵌套if語句也可以通過使用一個NavigableMap及其floorEntryceilingEntry方法,但避免if語句很可能更容易理解這裏。

+0

這很好,謝謝。我只是看着HSB,因爲我不確定它是如何在Java中讀取的,因爲它給出的值在0到1之間,因爲它應該在0到360之間,但顯然你已經解釋了這一點,所以非常感謝。 – user2517280

+0

+1您在這裏受歡迎 – mKorbel