2016-09-18 11 views
1

Я создаю приложение, которое использует OCR для чтения текста с изображения (используя Tess4J для Tesseract Google), но я хочу проигнорировать текст с оттенком и только прочитать серый.Обнаружить и удалить ряд цветов из 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 
     } 
}