java验证码识别--1
http://blog.csdn.net/problc/article/details/5794460
java验证码识别--2
http://blog.csdn.net/problc/article/details/5797507
java验证码识别--3
http://blog.csdn.net/problc/article/details/5800093
java验证码识别--4
http://blog.csdn.net/problc/article/details/5846614
java验证码识别--5
http://blog.csdn.net/problc/article/details/5983276
如何识别高级的验证码-粘连等
http://blog.csdn.net/problc/article/details/22796609
常见验证码的弱点与验证码识别
http://blog.csdn.net/problc/article/details/22796971
(本文仅用于学习研究图像匹配识别原理,不得用于其他用途。)
完整eclipse工程http://download.csdn.net/detail/problc/3829004
最近看了看验证码的识别,先从最简单的做起吧(固定大小,固定位置,固定字体)
验证码识别基本分四步,图片预处理,分割,训练,识别
看一个最简单验证码
这是一个德克萨斯扑克的注册页面的验证码
1。图像的预处理
这种直接根据亮度设个阈值处理就可以了
public static int isWhite(int colorInt) { Color color = new Color(colorInt); if (color.getRed() + color.getGreen() + color.getBlue() > 100) { return 1; } return 0; } public static BufferedImage removeBackgroud(String picFile) throws Exception { BufferedImage img = ImageIO.read(new File(picFile)); int width = img.getWidth(); int height = img.getHeight(); for (int x = 0; x < width; ++x) { for (int y = 0; y < height; ++y) { if (isWhite(img.getRGB(x, y)) == 1) { img.setRGB(x, y, Color.WHITE.getRGB()); } else { img.setRGB(x, y, Color.BLACK.getRGB()); } } } return img; }
处理完图片效果为
图像基本分得比较清楚,图片分割也比较容易
2。分割
这个验证码居然是固定位置的,分割相当简单,直接截取相应位置就可以了
public static List
3。训练
直接拿几张图片,包含0-9,每个数字一个样本就可以了,将文件名对应相应的数字
4。识别
因为是固定大小,固定位置,识别也很简单。
直接拿分割的图片跟这个十个图片一个像素一个像素的比,相同的点最多的就是结果。比如如果跟5.jpg最相似,那么识别的结果就是5。
下面是识别结果,很容易达到100%
完整代码(csdn连个附件都不支持):
import java.awt.Color; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.imageio.ImageIO; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.io.IOUtils; public class ImagePreProcess { public static int isWhite(int colorInt) { Color color = new Color(colorInt); if (color.getRed() + color.getGreen() + color.getBlue() > 100) { return 1; } return 0; } public static int isBlack(int colorInt) { Color color = new Color(colorInt); if (color.getRed() + color.getGreen() + color.getBlue() <= 100) { return 1; } return 0; } public static BufferedImage removeBackgroud(String picFile) throws Exception { BufferedImage img = ImageIO.read(new File(picFile)); int width = img.getWidth(); int height = img.getHeight(); for (int x = 0; x < width; ++x) { for (int y = 0; y < height; ++y) { if (isWhite(img.getRGB(x, y)) == 1) { img.setRGB(x, y, Color.WHITE.getRGB()); } else { img.setRGB(x, y, Color.BLACK.getRGB()); } } } return img; } public static List