一、验证码识别的概念

机器识别图片主要的三个步骤为消去背景、切割字符、识别字符。而现有的字符验证码也针对这三个方面来设计强壮的验证码。

以下简图帮助大家理解验证码识别的流程:

二、处理流程

其中最为关键的就是好图像处理这一步了。图像处理功能模块包括图像的灰度化、二值化、离散噪声点的去除、倾斜度校正、字符的切割、图像的归一化等图像处理技术 。

1、 图像的灰度化
由于 256 色的位图的调色板内容比较复杂,使得图像处理的许多算法都没有办法展开,因此有必要对它进行灰度处理。所谓灰度图像就是图像的每一个像素的 R、G、B 分量的值是相等的。彩色图像的每个像素的 R、G、B 值是不相同的,所以显示出红绿蓝等各种颜色。灰度图像没有这些颜色差异,有的只是亮度上的不同。灰度值大的像素点比较亮(像素值最大为 255,为白色),反之比较暗(像素值最小为 0,为黑色)。图像灰度化有各种不同的算法,比较直接的一种就是给像素的 RGB 值各自一个加权系数,然后求和;同时还要对调色板表项进行相应的处理。

2、 图像的二值化
要注意的是,最后得到的结果一定要归一到 0-255 之内。因为这是每个字节表示
图像数据的极限。

3、 去噪
图像可能在生成、传输或者采集过程中夹带了噪声,去噪声是图像处理中常用的手法。通常去噪声用滤波的方法,比如中值滤波、均值滤波。但是那样的算法不适合用在处理字符这样目标狭长的图像中,因为在滤波的过程中很有可能会去掉字符本身的像素。

一个采用的是去除杂点的方法来进行去噪声处理的。具体算法如下:扫描整个图像,当发现一个黑色点的时候,就考察和该黑色点间接或者直接相连接的黑色点的个数有多少,如果大于一定的值,那就说明该点不是离散点,否则就是离散点,把它去掉。在考察相连的黑色点的时候用的是递归的方法。此处,我简单的用python实现了,大家可以参考以下。

#coding=utf-8
"""
creat time:2015.09.14
"""
import cv2
import numpy as np
from matplotlib import pyplot as plt
from PIL import Image,ImageEnhance,ImageFilterimg_name = '2+.png'
#去除干扰线
im = Image.open(img_name)
#图像二值化
enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(2)
im = im.convert('1')
data = im.getdata()
w,h = im.size
#im.show()
black_point = 0
for x in xrange(1,w-1):for y in xrange(1,h-1):mid_pixel = data[w*y+x] #中央像素点像素值if mid_pixel == 0: #找出上下左右四个方向像素点像素值top_pixel = data[w*(y-1)+x]left_pixel = data[w*y+(x-1)]down_pixel = data[w*(y+1)+x]right_pixel = data[w*y+(x+1)]#判断上下左右的黑色像素点总个数if top_pixel == 0:black_point += 1if left_pixel == 0:black_point += 1if down_pixel == 0:black_point += 1if right_pixel == 0:black_point += 1if black_point >= 3:im.putpixel((x,y),0)#print black_pointblack_point = 0
im.show()

原验证码:

处理后:

4、分割
图像中一般会含有多个数字,识别的时候只能根据每个字符的特征来进行判断,所以还要进行字符切割的工作。这一步工作就是把图像中的字符独立的切割出来。

具体的算法如下:

第一步,先自下而上对图像进行逐行扫描直至遇到第一个黑色的像素点。记录下来。然后再自上而下对图像进行逐行扫描直至找到第一个黑色像素,这样就找到图像大致的高度范围。

第二步,在这个高度范围之内再自左向右逐列进行扫描,遇到第一个黑色像素时认为是字符切割的起始位置,然后继续扫描,直至遇到有一列中没有黑色像素,则认为这个字符切割结束,然后继续扫描,按照上述的方法一直扫描直至图像的最右端。这样就得到了每个字符的比较精确宽度范围。

第三步,在已知的每个字符比较精确的宽度范围内,按照第一步的方法,分别进行自上而下和自下而上的逐行扫描来获取每个字符精确的高度范围。

5、 图像的归一化
因为采集的图像中字符大小有可能存在较大的差异,或者是经过切割后的字符尺寸不统一,而相对来说,统一尺寸的字符识别的标准性更强,准确率自然也更高,归一化图像就是要把原来各不相同的字符统一到同一尺寸,在系统实现中是统一到同一高度,然后根据高度来调整字符的宽度。具体算法如下:先得到原来字符的高度,跟系统要求的高度做比较,得出要变换的系数,然后根据得到的系数求得变换后应有得宽度。在得到宽度和高度之后,把新图像里面的点按照插值的方法映射到原图像中。

不少人认为把每个字符图像归一化为 5×9 像素的二值图像是最理想的,因为图像的尺寸越小,识别速度就越高,网络训练也越快。而实际上,相对于要识别的字符图像, 5×9 像素图太小了。归一化后,图像信息丢失了很多,这时进行图像识别,准确率不高。实验证明,将字符图像归一化为 10×18 像素的二值图像是现实中是比较理想的,达到了识别速度快和识别准确率高的较好的平衡点。

三、识别

图像识别包括特征提取、样本训练和识别三大块内容。

验证码识别其中最为关键的就是去噪和分割,这对你的训练和识别的精度都有着很大的影响。这里只讲了大致的流程,其中每个细节都有很多工作要做,这里码字也很难讲清楚,大家可以以这个流程为主线,一步步的实现,最终也就能完成你的需求。

验证码——python去除干扰线相关推荐

  1. python去干扰线_验证码——python去除干扰线

    [在上一篇文章中,我们使用sklearn对验证码进行了识别,为了提高识别率,今天来进行进一步优化. 观察验证码后,发现还可以对其进行旋转处理,这个验证码旋转角度在-30-30 一.验证码识别的概念 机 ...

  2. python 验证码去除干扰线,python 对验证码图片进行降噪处理

    python 对验证码图片进行降噪处理 发布时间:2018-05-16 20:38, 浏览次数:962 , 标签: python 首先贴一张验证码上来做案例: 第一步先通过二值化处理把干扰线去掉: f ...

  3. python去干扰线_GitHub - Guardiant/VerifyCode: 验证码去干扰线识别

    VerifyCode 使用Python给图片去干扰线和噪点 Img.py 处理验证码,对验证码进行去燥,分割 Crack.py 破解验证码,得到验证码数据 此程序运行在Python3.5版本上,不是P ...

  4. 图片验证码--BufferedImage 图片验证码去除干扰线

    java-BufferedImage 图片验证码去除干扰线的方法( 用于OCR tesseract图像智能字符识别) 图片验证码自动识别的功能 网上对于初始图片的处理方法有去噪点.灰度化等,唯独难搜到 ...

  5. OpenCV学习第十三篇:提取水平和垂直线(去除干扰线)

    1.结构元素 可以是任意形状的结构元素:矩形,圆,直线,磁盘形状,砖石形状等 2.提取步骤 输入图像彩色图像imread 转换为灰度图像cvtColor 转换为二值图像adaptiveThreshol ...

  6. java 去除干扰_【Selenium-WebDriver实战篇】Java丨验证码图片去除干扰像素,方便验证码的识别(转)...

    1.先来看看效果: 原图 除去干扰像素后 2.解析代码: 1).读取文件夹里面的图片 1 String fileName = "picture"; 2 BufferedImage ...

  7. python 加干扰线 图片生成_用Python一键生成炫酷九宫格图片,火了朋友圈

    作为一个男同胞来说,为了给女朋友拍一张美美的照片,着实需要花费很大的时间和精力,不仅仅需要从众多的图片中精心挑选,而且还需要有着超强的图片精修能力,才能得到一张张达到女友要求的图片,真心不容易啊- 朋 ...

  8. java图形验证码去除干扰,使用python 对验证码图片进行降噪处理

    首先贴一张验证码上来做案例: 第一步先通过二值化处理把干扰线去掉: from PIL import Image # 二值化处理 def two_value(): for i in range(1,5) ...

  9. python去除噪点_如何用python搞定验证码中的噪点

    背景:朋友在为"关山口男子职业技术学校"写一款校园应用,于是找MoonXue写一个学生选课系统的登录接口.为了搞定这个接口,不得不先搞定这个系统的验证码. 验证码大概是这个样子 看 ...

最新文章

  1. Linq-ToList与ToArray
  2. java8之重新认识HashMap(转自美团技术团队)
  3. C++睡眠延时函数 Sleep() usleep()(windows.h、unistd.h)
  4. python中空格字符是什么_关于Python中空格字符串处理的技巧总结
  5. 如何评估序列推荐模型?
  6. ocelot 中间件的变化
  7. Net Core下多种ORM框架特性及性能对比
  8. 史上最全Java多线程面试题
  9. Android系统优化(65)---MTK 平台开关机、重启时间优化
  10. java中的与或运算
  11. oracle-00028,Oracle 10g錯誤:「ORA-00028:您的會話已被終止」
  12. SAE实践——用SVN命令行同步/提交代码
  13. HDU多校练习第一场4608——I_Number
  14. PHPMailer如何获取QQ邮箱授权码
  15. Java实现QQ机器人
  16. 什么app可以绘制路线图_为什么大多数路线图都会不可避免地带来糟糕的结果
  17. java 写服务器向客户端发送消息,java服务器向客户端发送消息
  18. 鸿图之下服务器维护10月25,鸿图之下11月25日维护更新公告
  19. python汽车_Python 小车代码
  20. Android Kotlin-协程

热门文章

  1. Tracer 记录 Controller 日志
  2. Linux高性能集群(AMD处理器)Linpack测试方法
  3. C++ - PAT- L1-030. 一帮一(天梯赛决赛题目)
  4. mysql的字符串等于函数吗_MySQL函数的字符串函数
  5. 数据结构实验报告—栈和队列
  6. 亿道信息丨12.2英寸加固平板丨三防平板丨工业平板丨货物追踪好助手
  7. JSON.stringify()和JSON.parse()
  8. 理解镜像、容器和存储驱动
  9. java画太极加图片_新手初学java 尝试编程绘画太极图
  10. 【20220207】【信号处理】希尔伯特变换定义及解调原理