解析图片验证码 _shengyao15的博客-程序员秘密

技术标签: 算法  C++  C  J#  算法 人工智能  ITeye  

1, 生成图片请参照 [url]http://tristan-s.iteye.com/admin/blogs/1026307[/url]

2, 目前只能解析没有干扰素的数字图片。 例如:
[img]http://dl.iteye.com/upload/attachment/475548/c4d8b563-8752-3ebc-b092-bacefa2e873f.jpg[/img]
OK卡网站的验证码
[img]http://dl.iteye.com/upload/attachment/475555/ead7486b-57ae-3cf4-a137-1f8fcda70226.bmp[/img]
去除干扰素,可以用以下算法
a> 线条的: 检查该线条是否是贯通的直线条,如是则去掉
b> 点: 检查该点是否是孤立的,如是则去掉

3, 需要将图片中的数字用0,1的形式来表达。解析每个数字,见附件

4, 代码
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

public class ImageDemo {

public static String parse(BufferedImage img){
int width = img.getWidth();
int height = img.getHeight();

StringBuilder sb = new StringBuilder();

for (int j = 0; j < height; j++) {
for (int i = 0; i < width; i++) {
int RGB = img.getRGB(i, j);
int red = (RGB >> 16) & 0xff;
if (red < 100) {
sb.append("1");
} else {
sb.append("0");
}
}
}

String s = sb.toString();
String s2 = s;
// System.out.println("图片的String码: " + s);
// System.out.println("--------------");
// for (int i = 0; i < height; i++) {
// System.out.println(s2.substring(0, width));
// s2 = s2.substring(width);
// }

return s;
}

public static void calResult(String s){
if(s.indexOf(n0)>=0){
System.out.print(" 0");
}else if(s.indexOf(n1)>=0){
System.out.print(" 1");
}else if(s.indexOf(n2)>=0){
System.out.print(" 2");
}else if(s.indexOf(n3)>=0){
System.out.print(" 3");
}else if(s.indexOf(n4)>=0){
System.out.print(" 4");
}else if(s.indexOf(n5)>=0){
System.out.print(" 5");
}else if(s.indexOf(n6)>=0){
System.out.print(" 6");
}else if(s.indexOf(n7)>=0){
System.out.print(" 7");
}else if(s.indexOf(n8)>=0){
System.out.print(" 8");
}else if(s.indexOf(n9)>=0){
System.out.print(" 9");
}
}

public static void main(String[] args) throws Exception {

//File file = new File("c:/image/num/nn" + n + ".jpg");
File file = new File("c:/image/image1.jpg");

BufferedImage imgOrg = ImageIO.read(file);
BufferedImage img = imgOrg.getSubimage(8, 0, 10, 20);
BufferedImage img2 = imgOrg.getSubimage(20, 0, 10, 20);
BufferedImage img3 = imgOrg.getSubimage(35, 0, 10, 20);
BufferedImage img4 = imgOrg.getSubimage(45, 0, 10, 20);

System.out.println("图片解析结果:");

String s = parse(img);
calResult(s);

String s2 = parse(img2);
calResult(s2);

String s3 = parse(img3);
calResult(s3);

String s4 = parse(img4);
calResult(s4);

}


private static String n0 = "000000000000011110000011111100011100111001100001100110000110011000011001100001100110000110011000011001100001100111001110001111110000011110000000000000";
private static String n1 = "000000000000000110000000111000000111100000110110000010011000000001100000000110000000011000000001100000000110000000011000000001100000000110000000000000";
private static String n2 = "000000000000011110000011111100011100111001100001100000000110000000011000000011000000011000000011000000011000000011000000011111111001111111100000000000";
private static String n3 = "000000000000011100000011111000011000110000000011000000001100000011100000001111000000000110000000011001100001100110000110001111110000011110000000000000";
private static String n4 = "000000000000000110000000111000000011100000011110000011011000001101100001100110001100011000111111111011111111100000011000000001100000000110000000000000";
private static String n5 = "000000000000111111000011111100001100000001100000000110111000011111110001100001100000000110000000011001100001100110000110001111110000011110000000000000";
private static String n6 = "000000000000011110000011111100001100011001100000000110000000011011100001111111000111000110011000011001100001100011000110001111110000011110000000000000";
private static String n7 = "000000000001111111100111111110000000010000000011000000011000000001100000001100000000110000000011000000001100000001100000000110000000011000000000000000";
private static String n8 = "000000000000011110000011111100011000011001100001100110000110001111110000111111000110000110011000011001100001100110000110001111110000011110000000000000";
private static String n9 = "000000000000011110000011111100011000011001100001100110000110011000111000111111100001110110000000011000000001100110001100001111110000011110000000000000";
private static String n = "9";
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/shengyao15/article/details/83915283

智能推荐

Java 程序员 面试前必备知识_xiaofeng66666的博客-程序员秘密

前言正文自我介绍数据结构和算法Java篇Java EE知识点储备计算机网络操作系统数据库相关XML常识性知识总结前言准备了接近两个月的面试笔试,现在终于是可以休息下了。真真是应了那句老话“台上一分钟, 台下十年功。”。人嘛,越努力,才会越幸运。机会总是留给有准备的人的。下面分享一下我的Java实习生准备所看过的材料,(虽然至今还有些依然看不懂地方。) 希望对这方面的同学有点帮助。正文自我介绍先针对...

Axios---axios的用法详解_axios返回值解析成json_Cirrod的博客-程序员秘密

一、axios的基本特性axios (官网: https://qithub.com/axios/axios)是一个基于Promise用于浏览器和node.js的HTTP客户端。它具有以下特征:①支持浏览器和node.js②支持promise③能拦截请求和响应④自动转换JSON数据二、axios的基本用法axios.请求的方式( '请求地址' ).then (res=&gt;{//data属性名称是固定的,用于获取后台响应的数据console.log(res.d...

[Cqoi 2018] bzoj5301 异或序列 [莫队]_5301: [cqoi2018]异或序列_pocket_legend的博客-程序员秘密

Description: 已知一个长度为nnn的整数数列a[1],a[2],…,a[n]a[1],a[2],…,a[n]a[1],a[2],…,a[n],给定查询参数l、rl、rl、r,问在 [l,r][l,r][l,r]区间内,有多少连续子 序列满足异或和等于kkk。 也就是说,对于所有的x,y(l≤x≤y≤r)x,y(l≤x≤y≤r)x,y (l≤x≤y≤r),能够满足a[x]a[x]a...

Xml节点解析 Android,【已解决】Android中用DOM方式解析xml时使用getElementsByTagName去获得节点结果为空..._櫻花朽木的博客-程序员秘密

【问题】折腾:时,试了试下面代码:public static ArrayList getXmlItems(InputStream inputStream, String tag){ArrayList xmlItemList = new ArrayList();DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();...

MySQL社区版下载及安装教程_mysql 免費版_KonBAI-Q的博客-程序员秘密

MySQL社区版下载及安装教程1、下载此教程演示为MySQL8社区版压缩包版本的,点击以下链接进入下载页面(需要Oracle账号,没有的可先进行注册)MySQL下载链接完成后,我们就得到一个压缩包,把这个压缩包进行解压(这里我演示是并不是最新版)2、配置环境变量// 变量值为MYSQL根目录变量名:MYSQL_HOME变量值:~\mysql-8.0.xx-winx64 //(这...

随便推点

转:关于对中颖EEPROM 的操作解析_haliluya1111的博客-程序员秘密

[cpp] view plaincopy"code" class="cpp">/*     中颖EEPROM,使用比较方便,但有个注意点,就是每次无论你写入     什么数据或者在哪个地址写数据,都需要将对 对应的块擦除,擦     除后才能写入成功。 */  #define  SSPWriteFlag     0x5A  #define  

C# WebRequest WebResponse的使用_dxm809的博客-程序员秘密

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.IO;using System.Linq;using System.Net;using System.Text;using System.Threa...

Math常用方法_网络卷毛的博客-程序员秘密

public class Demo{ public static void main(String args[]){ /** *Math.sqrt()//计算平方根 *Math.cbrt()//计算立方根 *Math.pow(a, b)//计算a的b次方 *Math.max( , );//计算最...

Netty 粘包和拆包详解_架构攻城之路的博客-程序员秘密

1. 前言前面几个章节主要解析了 Netty 的编码、解码问题,那么是否有了编解码器,我们的 Netty 通信就能正常了呢?TCP 协议在传输数据时没有办法判断数据是什么时候结束的,它无法识别一段完整的信息,因此可能会导致接受到的数据和发送时的数据不一致的情况。因此需要人为的指定一种规范的协议,从而保证数据的安全性,比如:我们所熟悉的 HTTP 协议。本节内容,我们主要需要以下两点知识TCP 拆包、粘包的原因; TCP 拆包、粘包的解决方案。2. 学习目的拆包、粘包在 TCP 协

泰勒公式矩阵形式_泰勒公式,雅可比矩阵,海塞矩阵,牛顿法_黑潮制作所的博客-程序员秘密

泰勒公式,雅可比矩阵,海塞矩阵,牛顿法泰勒公式,雅可比矩阵,海塞矩阵,牛顿法泰勒公式是一个在函数上取某点的近似值,如果函数足够平滑的话,在已知函数在某一点的各阶导数值的情况之下,泰勒公式可以用这些导数值做系数构建一个多项式来近似函数在这一点的近似值。泰勒公式还给出了这个多项式和实际的函数值之间的偏差泰勒公式是将一个在x=x0处具有n阶导数的函数f(x)利用关于(x-x0)的n次多项式来逼近函数的方...

ListView下拉刷新和上拉加载原理_下拉加载逻辑是什么_SunnyRivers的博客-程序员秘密

ListView的下拉刷新逻辑:一、获取ListView的头布局的高度并通过给头布局setPading方法,将头布局隐藏二、重写ListView的onTouchEvent方法计算出滑动的偏移量dy三、通过比较偏移量和头布局的高度,进行UI的修改ListView上拉加载逻辑:一、获取ListView的脚布局的高度并通过setPading方法,将头布局隐藏二、调用ListVie