2016-09-18 42 views
1

我正在構建一個應用程序,它使用OCR從圖像中讀取文本(使用Tess4J for Google的Tesseract),但我想忽略棕褐色的文本,只能讀取灰色。檢測並從Java中刪除一系列顏色BufferedImage

例如,在下面的圖片中,我只想讀「Ricki」並忽略「AOA」。 http://i.imgur.com/daCuTbB.png

爲了實現這一點,我想在執行OCR之前從圖像中去除棕褐色是我的最佳選擇。

/* Remove RGB Value for Group Tag */ 
    int width = image.getWidth(); 
    int height = image.getHeight(); 
    int[] pixels = new int[width * height]; 
    image.getRGB(0, 0, width, height, pixels, 0, width); 
    for (int i = 0; i < pixels.length; i++) { 
     //If pixel is between dark-tan value and light-tan value 
     if (pixels[i] > 0xFF57513b && pixels[i] < 0xFF6b6145) { 
      // Set pixel to black 
      System.out.println("pixel found"); 
      pixels[i] = 0xFF000000; 
     } 
    } 
    image.setRGB(0, 0, width, height, pixels, 0, width); 

但是這段代碼也刪除了幾乎所有的灰色文本。您無法簡單地比較我所擁有的一系列值的十六進制顏色值。有另一種方法來檢測一系列的顏色嗎?或者更好的解決這個問題的方法?

+1

爲什麼不把它分解成單個組件? – gpasch

+0

更好的是,將RGB值轉換爲HSV,並基於Hue組件進行比較。 – haraldK

+0

@gpasch由個別組件你是否指個別顏色?問題是單個用戶名中每個像素的十六進制RGB值有很多不同,甚至在其他4個用戶名中也不一樣。 –

回答

0

haraldK通過提到轉換RGB指出我在正確的方向。通過位移動從十六進制值中獲取單獨的r,g和b int值,我可以比較某個範圍內的顏色並從圖像中遮住一系列顏色。

int baser = 108; //base red 
int baseg = 96; //base green 
int baseb = 68; //base blue 
int range = 10; //threshold + and - from base values 

/* Set all pixels within +- range of base RGB to black */ 
for (int i = 0; i < pixels.length; i++) { 
     int a = (pixels[i]>>24)  &0xFF; //alpha 
     int r = (pixels[i]>>16)  &0xFF; //red 
     int g = (pixels[i]>>8)  &0xFF; //green 
     int b = (pixels[i]>>0)  &0xFF; //blue 

     if ((r > baser-range && r < baser+range) && 
      (g > baseg-range && g < baseg+range) && 
      (b > baseb-range && b < baseb+range)) { 
       pixels[i] = 0xFF000000; //Set to black 
     } 
}