(本文仅用于学习研究图像匹配识别原理,不得用于其他用途。)
前面的验证码背景都比较简单,用亮度稍微区分一下就可以去掉背景
来看个稍微复杂一点的
1。图片预处理
怎么去掉背景干扰呢。
可以注意到每个验证码数字或字母都是同一颜色,所以把验证码平均分成5份
计算每个区域的颜色分布,除了白色之外,颜色值最多的就是验证码的颜色
因此很容易将背景去掉
代码:
public static BufferedImage removeBackgroud(String picFile)
throws Exception {
BufferedImage img = ImageIO.read(new File(picFile));
img = img.getSubimage(1, 1, img.getWidth() - 2, img.getHeight() - 2);
int width = img.getWidth();
int height = img.getHeight();
double subWidth = (double) width / 5.0;
for (int i = 0; i < 5; i++) {
Map map = new HashMap();
for (int x = (int) (1 + i * subWidth); x < (i + 1) * subWidth
&& x < width - 1; ++x) {
for (int y = 0; y < height; ++y) {
if (isWhite(img.getRGB(x, y)) == 1)
continue;
if (map.containsKey(img.getRGB(x, y))) {
map.put(img.getRGB(x, y), map.get(img.getRGB(x, y)) + 1);
} else {
map.put(img.getRGB(x, y), 1);
}
}
}
int max = 0;
int colorMax = 0;
for (Integer color : map.keySet()) {
if (max < map.get(color)) {
max = map.get(color);
colorMax = color;
}
}
for (int x = (int) (1 + i * subWidth); x < (i + 1) * subWidth
&& x < width - 1; ++x) {
for (int y = 0; y < height; ++y) {
if (img.getRGB(x, y) != colorMax) {
img.setRGB(x, y, Color.WHITE.getRGB());
} else {
img.setRGB(x, y, Color.BLACK.getRGB());
}
}
}
}
retur