从 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
}
}
我正在构建一个使用 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
}
}