文档章节

图像验证码识别(八)——字符归一化

moki_oschina
 moki_oschina
发布于 2016/11/29 11:45
字数 783
阅读 86
收藏 2

前面提到了将验证码上的字符分割成一个单独的字符图片并且保存,但是扣下来的字符串可能会有倾斜的现象,因为现在很多网页验证码为了防止破解都对字符进行了一定的扭曲和旋转,即使是同一个网站的验证码,每个相同的字符很有可能都是不一样的,所以为了提高识别的正确率,在这里最好能让每次进行训练的字符能够保持同一个角度。所以首先需要做的就是旋转倾斜。

一、旋转倾斜

旋转倾斜的目的就是要提高识别的正确率,如果字符‘A’的模板是标准的,让一个横着的‘A’去训练肯定得不到正确的结果。不过怎么旋转呢?想要将每个字符都旋转到印刷体的角度那是很难的,也是不必要的,在这里采用的思想就是每次都旋转成为“最瘦的”。每次分割出来一个字符不管是横着的还是竖着的,都可以回到“最瘦”的角度。具体做法就是利用OpenCV的旋转函数.

 

[cpp]  view plain  copy

  1. cv::Mat M = cv::getRotationMatrix2D(center, angle, scale);  


getRotationMatrix2D这个函数所做的就是计算旋转矩阵,熟悉计算机图形学的都知道,图形在做各种变换的时候都是在原有的矩阵上乘以变换矩阵。这里center是CvPoint2D32f类型的结构体,其有两个float类型的变量分别表示要旋转的图像的宽和高,angle就是要旋转的角度,scale是旋转后的缩放系数。得到变换矩阵之后就可以进行旋转操作了

 

 

[cpp]  view plain  copy

  1. warpAffine(m_Mat,rotate_mat, M,cvSize(getWidth(),getHeight()),INTER_LINEAR,BORDER_CONSTANT,cvScalar(WHITE) );  


warpAffine函数就是进行旋转操作。

 

鉴于大部分验证码的旋转都不是特别夸张,所以处理时我让字符从旋转的范围定在顺时针-15度到15度,每次旋转一度,然后计算最左边第一个黑色像素到最右边第一个黑色像素的距离,取距离最小的角度最终让字符旋转那个角度。

可以看到分割出来的字符和原始的还是有点不太一样,由于测试用的验证码倾斜的并不明显,所以这里调整的也不是很明显。

二、归一化

由于验证码大小不一,图片上又大量背景像素,因此在进行最后一步识别的时候,还应该将验证码的大小缩放到固定的大小。在这里我是先得到字符像素的最小外包矩形,这样可以先把没有用的白色背景像素干扰取消掉。接下来就是将所有的字符都统一缩放到16*16的大小,这样最终得到的经过预处理的标准字符就可以开始训练识别了。

本文转载自:http://www.voidcn.com/blog/ysc6688/article/p-5736549.html

共有 人打赏支持
moki_oschina
粉丝 24
博文 189
码字总数 39444
作品 0
成都
程序员
Java基于opencv实现图像数字识别(二)—基本流程

Java基于opencv实现图像数字识别(二)—基本流程 做一个项目之前呢,我们应该有一个总体把握,或者是进度条;来一步步的督促着我们来完成这个项目,在我们正式开始前呢,我们先讨论下流程。 ...

奇迹迪
06/10
0
0
使用OpenCV+Keras轻松破解验证码

选自Medium 作者:Adam Geitgey 机器之心编译 参与:李泽南、蒋思源 登录网站时必须输入的图片验证码可以用来识别访问者到底是人还是机器——这同时也是某种程度上的「图灵测试」,人工智能研...

机器之心
2017/12/14
0
0
仅需15分钟,使用OpenCV+Keras轻松破解验证码

  选自Medium   作者:Adam Geitgey   机器之心编译   参与:李泽南、蒋思源      登录网站时必须输入的图片验证码可以用来识别访问者到底是人还是机器——这同时也是某种程度上...

机器之心
2017/12/14
0
0
图像识别试验 - 字符验证码、车牌号、身份证号

© 野比 2012 欢迎大家和我讨论相关问题。 代码在此(注意此版并非最终版) 光学字符识别(OCR)是非常有用的技术。在验证码识别、车牌号识别、文字识别方面,基于字符的识别技术算是比较容易...

nothingfinal
03/09
0
0
Python 实现识别弱图片验证码

图片来自 unsplash 目前,很多网站为了防止爬虫肆意模拟浏览器登录,采用增加验证码的方式来拦截爬虫。验证码的形式有多种,最常见的就是图片验证码。其他验证码的形式有音频验证码,滑动验证...

猴哥Yuri
2017/12/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

20180925 df与du命令、fdisk磁盘分区

df 命令 disk filesystem的缩写,查看已挂载磁盘的总容量、使用容量、剩余容量信息。 [root@centos01 ~]# dfFilesystem 1K-blocks Used Available Use% Mounted on/dev/sda3 27...

野雪球
41分钟前
1
0
Shell编程(expect同步文件、指定host和同步文件、构建文件分发系统、批量执行命令)

expect脚本同步文件 需求:自动同步文件 实验准备: A机器:192.168.248.130 B机器:192.168.248.129 实现: 1.A机器编写4.expect脚本文件,内容如下所示: #!/usr/bin/expectset passwd "...

蛋黄_Yolks
今天
2
0
ppwjs之bootstrap颜色:背景颜色

<!DOCTYPT html><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>ppwjs欢迎您</title><link rel="icon" href="/favicon.ico" ......

ppwjs
今天
1
0
Ubuntu与 Fedora之对比

大家好。今天我将重点介绍两个流行的Linux发行版之间的一些特性和差异; Ubuntu 18.04和Fedora 28。它们都有自己的包管理; Ubuntu使用DEB,而Fedora使用RPM,但它们都具有相同的桌面环境(GNO...

linuxprobe16
今天
2
0
线性代数入门

线性代数的概念对于理解机器学习背后的原理非常重要,尤其是在深度学习领域中。它可以帮助我们更好地理解算法内部到底是怎么运行的,借此,我们就能够更好的做出决策。所以,如果你真的希望了...

牛奋Debug
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部