验证码的自动识别思路
2017-05-09 12:40
267 查看
简单验证码的识别基本步骤:灰度读取、二值化、分割、CNN训练识别
加入干扰线的验证码识别:
若干扰线的颜色和字符不同,则直接将颜色不一致的线条所在像素修改为背景色
若干扰线的颜色和字符相同,考虑干扰线的粗细和字符粗细比较
若干扰线较细,可以通过这两种方法去掉:
1、http://blog.csdn.net/eddy_zheng/article/details/48895085
2、http://bbs.csdn.net/topics/390430265
若干扰线较粗,则可以类似第一种方法,计算干扰线附近像素点的数目,大于某个阈值就确定为干扰线的部分
若干扰线和字符颜色一致,大小相差不多,目前还没想出什么办法。。
加入倾斜的验证码识别:
一般考虑将倾斜的字母通过一定角度投影,计算投影的长度,当长度达到最小,则倾斜可以矫正,参考以下两篇:
http://www.doc88.com/p-9085440806713.html https://blog.mythsman.com/2016/04/16/1/
加入噪音像素的验证码识别:
一般考虑中值滤波处理,参考这篇http://www.jianshu.com/p/41127bf90ca9
主要原理是这样的:把局部区域的像素按灰度等级进行排序,取该领域中灰度的中值作为当前像素的灰度值。
需要注意的是,中值滤波会使得图片模糊。
以下是一张验证码:
放大之后发现一个规律
干扰线的线条比较粗,并且通常呈现2行,可以发现规律将其去除,代码如下:
关于倾斜角度,原理跟我上面说的一样,需要用到仿射函数,代码如下:
def shadow(im):#传入图像im以及角度(角度制)angle,返回图像在该角度下的投影长度
thresh,im=cv2.threshold(255-im,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
y = {}
height , width = im.shape
for angle in np.linspace(45,135,91):
pts1=np.float32([[width/2,height/2],[width/2,0],[0,height/2]])
pts2=np.float32([[width/2,height/2],[width/2+height/2/math.tan(math.radians(angle)),0],[0,height/2]])
M=cv2.getAffineTransform(pts1,pts2)
dst=cv2.warpAffine(im,M,(width,height))
x=[]
for i in xrange(height):
for j in xrange(width):
if dst[i][j]==255:
x.append(j)
x=np.array(x)
y[angle] = x.max()-x.min()
# return y
return y.keys()[y.values().index(sort(y.values())[0])]
加入干扰线的验证码识别:
若干扰线的颜色和字符不同,则直接将颜色不一致的线条所在像素修改为背景色
若干扰线的颜色和字符相同,考虑干扰线的粗细和字符粗细比较
若干扰线较细,可以通过这两种方法去掉:
1、http://blog.csdn.net/eddy_zheng/article/details/48895085
2、http://bbs.csdn.net/topics/390430265
若干扰线较粗,则可以类似第一种方法,计算干扰线附近像素点的数目,大于某个阈值就确定为干扰线的部分
若干扰线和字符颜色一致,大小相差不多,目前还没想出什么办法。。
加入倾斜的验证码识别:
一般考虑将倾斜的字母通过一定角度投影,计算投影的长度,当长度达到最小,则倾斜可以矫正,参考以下两篇:
http://www.doc88.com/p-9085440806713.html https://blog.mythsman.com/2016/04/16/1/
加入噪音像素的验证码识别:
一般考虑中值滤波处理,参考这篇http://www.jianshu.com/p/41127bf90ca9
主要原理是这样的:把局部区域的像素按灰度等级进行排序,取该领域中灰度的中值作为当前像素的灰度值。
需要注意的是,中值滤波会使得图片模糊。
以下是一张验证码:
放大之后发现一个规律
干扰线的线条比较粗,并且通常呈现2行,可以发现规律将其去除,代码如下:
im = cv2.imread(path,0) #直接读为灰度图像 #plt.subplot(111),plt.imshow(im),plt.title('oo') im=np.array(im) point = np.min(im) h,w=im.shape#40,100 def change(black_point=0): for y in xrange(1,w-1):#1-39 for x in xrange(1,h-1):#1-99 mid_pixel = im[x,y] #中央像素点像素值 if mid_pixel == point: #找出下、右、右下三个方向像素点像素值 right_pixel = im[x+1,y] right_down_pixel = im[x+1,y+1] down_pixel = im[x,y+1] up_pixel=im[x-1,y] #判断三个方向的黑色像素点总个数 if right_down_pixel == point: black_point += 1 if up_pixel == point: black_point += 1 if right_pixel == point: black_point += 1 if down_pixel == point: black_point += 1 if black_point >= 3: im[x,y]=255 im[x+1,y]=255 im[x-1,y]=255 black_point = 0去除之后发现有些噪点没有去掉,这些噪点通常只有一个像素点或者上下两个,这样的话同样修改以上函数就可以达到去除效果。
关于倾斜角度,原理跟我上面说的一样,需要用到仿射函数,代码如下:
def shadow(im):#传入图像im以及角度(角度制)angle,返回图像在该角度下的投影长度
thresh,im=cv2.threshold(255-im,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
y = {}
height , width = im.shape
for angle in np.linspace(45,135,91):
pts1=np.float32([[width/2,height/2],[width/2,0],[0,height/2]])
pts2=np.float32([[width/2,height/2],[width/2+height/2/math.tan(math.radians(angle)),0],[0,height/2]])
M=cv2.getAffineTransform(pts1,pts2)
dst=cv2.warpAffine(im,M,(width,height))
x=[]
for i in xrange(height):
for j in xrange(width):
if dst[i][j]==255:
x.append(j)
x=np.array(x)
y[angle] = x.max()-x.min()
# return y
return y.keys()[y.values().index(sort(y.values())[0])]
相关文章推荐
- Webdriver配合Tesseract-OCR 自动识别简单的验证码
- 用于验证码图片识别的类(C#源码) 使用进程投票,可自动清除Alert弹出窗口,可自动换IP,ADSL用户自行修改Restart.bat中第三行内容
- 自动识别网页验证码VB代码
- 【Python】【验证码识别】python 模拟登陆时,验证码自动识别问题
- 验证码自动识别的基础知识汇总
- 如何定制一款12306抢票浏览器——处理预订页面和验证码自动识别功能
- [突发奇想] 验证码 识别人与自动化操作是否可采用 鼠标 停留位置 与 时间 来自动验证 是否是人呢?
- 正方教务系统验证码自动识别(非打码平台)
- 自动打码软件 自动识别验证码软件不要相信?
- Python 实现全自动登录(真正的全自动,自动识别验证码)
- 验证码自动识别的价值与意义
- WebDriver中自动识别验证码--Python实现
- python人工智能写验证码自动识别demo地址
- 「post中文参数问题」以及「验证码自动识别备忘」
- Webdriver配合Tesseract-OCR 自动识别简单的验证码
- PHP脚本自动识别验证码查询汽车违章
- selenium和Appium的简单验证码自动识别方法
- 验证码的识别的几种思路
- 自动识别图形验证码
- python爬虫之自动登录与验证码识别