从 Java BufferedImage 中检测并删除一系列颜色

Detect & remove a range of colors from Java BufferedImage

我正在构建一个使用 OCR 从图像中读取文本的应用程序(将 Tess4J 用于 Google 的 Tesseract),但我想忽略棕褐色文本而只读取灰色文本。

例如下图中,我只想读取"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);

但是这段代码也删除了几乎所有的灰色文本。您不能像我那样简单地比较一系列值的十六进制颜色值。还有另一种方法来检测一系列颜色吗?或者更好的不同方法来解决这个问题?

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
        }
}