标签:
对于去除噪音的技术,没有一个统一的算法,但是一个网站的验证码噪音,一定是有一定的规则的。只有分析出这个规则,就可以写相应的代码去除干扰。
例如,通过第二步,我们已经去除了一个验证码图片的背景,
很明显能看出,这个验证码图片,被后期的的时候,加入了一条干扰线,而且干扰线出像素点事一致的,那就好办了,我们可以写一个程序,顺序的扫描这条干扰线,然后动态的去除。可以按照第二步的分析像素的方法分析,可以容易的分析出干扰数据。
具体的代码如下所示:
/** * 去噪音(去除干扰线) * * @param image * 原图片 * @return 去噪音后的图片 */ public static BufferedImage StartDenoising(BufferedImage img) { int width = img.getWidth(); int height = img.getHeight(); for (int x = 0; x < width; x++) { // 记录数列的点 List<PixColorShow> PixColorShowList = new ArrayList<PixColorShow>(); for (int y = 0; y < height; y++) { Color color = new Color(img.getRGB(x, y)); PixColorShow pColorShow = new PixColorShow(); pColorShow.pixValue = color.getRed(); pColorShow.YCoordinate = y; PixColorShowList.add(pColorShow); } //判断连续点 StringBuffer sBuffer = new StringBuffer(); for (int index = 0; index < PixColorShowList.size(); index++) { if (PixColorShowList.get(index).pixValue < 100) { sBuffer.append("1"); } else { sBuffer.append("0"); } } String showString=sBuffer.toString(); //System.out.println(showString); ArrayList<Integer> seriesPointList=new ArrayList<Integer>(); Pattern pattern = Pattern.compile("0110"); Matcher matcher = pattern.matcher(showString); while (matcher.find()) { int startpoise =matcher.start(); int endpoise=matcher.end(); while (startpoise<endpoise) { seriesPointList.add(startpoise); startpoise++; } } // 去除连续点 for (int i=0;i<seriesPointList.size();i++) { img.setRGB(x, seriesPointList.get(i), Color.WHITE.getRGB()); } } return img; }
标签:
原文地址:http://www.cnblogs.com/nyist2007/p/4758460.html