收藏 分享(赏)

图形验证码识别系统说明书.doc

上传人:dzzj200808 文档编号:4042334 上传时间:2018-12-05 格式:DOC 页数:24 大小:100.50KB
下载 相关 举报
图形验证码识别系统说明书.doc_第1页
第1页 / 共24页
图形验证码识别系统说明书.doc_第2页
第2页 / 共24页
图形验证码识别系统说明书.doc_第3页
第3页 / 共24页
图形验证码识别系统说明书.doc_第4页
第4页 / 共24页
图形验证码识别系统说明书.doc_第5页
第5页 / 共24页
点击查看更多>>
资源描述

1、*实践教学*兰州理工大学计算机与通信学院2015 年春季学期工程开发综合训练 课程设计题 目: 图形验证码识别系统 专业班级: 计算机科学与技术 12 级 1 班 姓 名: 学 号: 指导教师: 成 绩: 目录摘 要 .11.问题描述 .22.系统设计 .32.1 数字图象处理 32.2 图像的预处理 32.3 字符分割 52.4 字符识别 63.系统实现 .74. 系统测试 .194.1 测试目的 .194.2 测试采用的方法 .194.3 测试结果 .195.总结 22参考文献 231摘 要随着互联网的高速发展,网络在给人们的生活带来极大便利的同时,其安全问题也日益突出。图形验证码作为一项

2、广泛使用的验证手段,对网络安全起到了重要的作用。本设计要求学生开发一个基于图像处理的图形验证码识别系统。该系统可以对验证码图像进行灰度化、二值化、去噪、字符分割、字符识别等处理,并能够显示识别结果。此外,学生通过该题目的设计过程,可以初步应用软件系统的开发原理和开发方法,全面培养软件开发过程中的分析、设计、编码、测试及文档规范书写的能力,得到软件工程的训练,提高解决实际问题的能力。关键词:图形验证码,二值化,去噪,字符分割21.问题描述随 着 网 络 的 迅 速 普 及 , 人 们 接 触 电 脑 的 机 会 越 来 越 多 , 可 以 说 生 活 中 电 脑 已 经成 为 不 可 分 割 的

3、 一 部 分 。 而 我 们 在 上 网 的 同 时 , 也 会 遇 到 各 种 各 样 的 问 题 , 比 如 在网 上 购 物 , 参 与 论 坛 讨 论 等 等 的 时 候 , 都 会 遇 到 各 式 各 样 的 验 证 码 , 纯 数 字 的 , 带字 母 的 , 还 有 的 在 字 符 背 景 上 做 文 章 , 改 变 色 彩 , 添 加 一 些 干 扰 的 因 素 , 让 上 网 的环 境 不 是 那 么 轻 松 。有 时 候 , 人 们 会 因 为 一 两 个 验 证 码 不 能 识 别 导 致 购 物 失 败 或 者 交 易 失 误 而 懊 恼 ,毕 竟 人 眼 所 能 看

4、到 的 范 围 是 很 小 的 一 部 分 , 有 好 多 的 东 西 用 肉 眼 是 无 法 辨 别 清 楚 ,所 以 这 个 时 候 就 需 要 依 托 一 些 简 单 的 识 别 系 统 , 比 如 这 个 图 形 验 证 码 识 别 系 统 , 去帮 助 人 们 正 确 的 得 到 验 证 码 的 信 息 。本 系 统 有 好 几 种 识 别 验 证 码 的 方 法 , 对 于 各 样 的 验 证 码 都 会 顺 利 的 得 出 结 果 。比 如 单 纯 的 数 字 , 带 字 母 的 , 添 加 背 景 干 扰 信 息 。 系 统 通 过 对 图 形 验 证 码 的 样 子 进行 数

5、 字 图 像 处 理 , 图 像 预 处 理 , 用 这 样 的 技 术 将 图 形 中 的 干 扰 识 别 的 信 息 去 除 掉 ,让 真 正 需 要 的 数 字 或 者 字 母 清 晰 的 显 现 出 来 。 所 用 到 的 技 术 有灰度化、二值化、去噪、字符分割、字符识别等。有了识别验证码系统,人们在使用电脑网上工作的时候避免不必要的失误,节省很多的时间。32.系统设计2.1 数字图象处理 一幅图像可以定义为一个二维数组 f(x,y),这里 x,y 是空间坐标,而在任何一对空间坐标(x,y)上的幅值 f 称为该点图像的强度或灰度。当 x,y 和幅值 f为有限的、离散的数值时,称该图像

6、为数字图像。自然界呈现在人眼中的图像是连续的模拟信号,在计算机处理前,必须用图像传感器把光信号转换为表示亮度的电信号,再通过取样和量化得到一副数字图像。取样是对图像在坐标上进行离散化的过程,每一个取样点称为一个像素。量化是对图像灰度上的离散化过程。取样后将得到 M*N 个像素,每个像素量化得到一个灰度值 L,以 L 表示灰度值的允许取值范围,则数字图像存储需要的比特数b 可以表示为:b=M*N*L图像的灰度值取值范围被称为图像的动态范围。把占有灰度级全部有效段的图像称为高动态范围图像,高动态范围图像有较高的对比度。相反,地动态范围的图像看上去是冲淡了的灰暗格调。2.2 图像的预处理主要是对图像

7、进行灰度化、二值化、抑噪(滤波)等技术。1、图像的灰度化RGB 系统中一个颜色值由 3 个分量组成,这样的图像称为彩色图像,RGB 系统称为颜色空间模型。常见的颜色空间模型还有 HSI、CMYK 等。如果一幅图像的颜色空间是一维的(一个颜色值只有一个颜色分量),则这幅图像就是一副灰度图。在位图图像中,一般以 R=G=B 来显示灰度图像。常用的灰度化方法有以下三种:4其中,公式(2.1)的方法来源于 I 色彩空间中 I 分量的计算公式,公式(2.2)来源于 NTSC 色彩空间中 Y 分量的计算公式。公式(2.3)是基于采用保留最小亮度(黑色)的方法。RGB 彩色图像可以看成是由 3 副单色的灰度

8、图像构成的,可以直接取 RGB 通道中的任一个通道得到灰度化图像,前提是图像中目标像素的亮度信息主要分布在 B 通道上,否则灰度化结果将是亮度信息的大量丢失。灰度图像又叫亮度图像,由归一化的取值表示亮度,最大取值表示白色,最小取值表示黑色。以 P(x,y)表示图像中一个点,x、y 分别是图像的横坐标和纵坐标,R(x,y)表示 R 通道的颜色分量,G(x,y)表示 G 通道的颜色分量,B(x,y)表示 B 通道的颜色分量。点 P(x,y)的亮度值用 L(x,y)表示。彩色图像的亮度没有严格的定义和计算公式,一般用公式(2.1)来计算,我们记作 L1(x,y)。同样的用公式(2.2)计算的亮度值记

9、作 L2(x,y),用公式(2.3)计算的亮度值记作 L3(x,y)。可以证明:公式(2.1)取 RGB 通道的平均值,得到的图像相对比较柔和,同时也缩小了目标和背景的平均亮度差,不利于后续的阀值处理。公式(2.2)考虑了人眼对绿色的适应度最强,蓝色次之,红色最差。在处理绿色调和蓝色调的验证码图像时,公式(2.2)的效果令人满意,但在处理红色调的图像时,因为公式中红色的权值很小,灰度化后目标像素和背景像素的亮度差值被严重缩小,效果还不如公式(2.1)。公式(2.3)基于一个前提,那就是有限保留目标像素的亮度信息,利于后续的阀值分割。需要说明的是,要根据图像灰度化的目的不同,原图色彩特征的不同,

10、选择合适的灰度化方法。2、图像的二值化一般 24 位 RGB 图像的灰度图是 8 位 256 个灰度级的,如果把这个灰度级减少到 1 位 2 个灰度级,就得到一副二值图,二值图像中的数据全部是 0 或 1。2.3 字符分割字符分割包括从验证码图像中分割出字符区域和把字符区域划分成单个字符5两个部分。如果采用统计特征匹配以及神经网络法识别,必须要先分割出单个的字符。简单的分割方法包括等距分割、积分投影分割、交叉点分割、求连通区等。其中,粘连字符的分割是一个难点,复杂的粘连情况下分割比较困难,是一个硬人工智能问题。 2.4 字符识别字符识别就是把处理后的图片还原回字符文本的过程。可以分成基于字符分

11、割的识别(包括采用神经网络、SVM、各种统计距离的识别法)和模板匹配法识别。字符识别的常用做法是:先获取该字符的特征码,然后使用各种分类算法将对该特征码进行分类,将其打上相应的类标签。分类模型的训练,是对字符库中的每个字符进行特征化处理,得到每个字符的特征码,该字符的标签就是该字符本身,利用特征码加上字符的标签对字符库中的所有数据进行训练,得到相应的分类模型。当然,得到了待识别字符的特征码后,也可以使用相似性度量和字符库中的字符的特征码进行比较,将该字符识别为与其特征码相似性最高的字符。现在的问题就集中在如何获取字符的特征码。文章 2中介绍了一种简单的获取特征码的方法:对于二值化后的图像进行分

12、割,分割出来的图像是一个个的字符,如下图所示:在每个字符的边界内,按行(或列)扫描该图片,检测其中的每个像素点,如果像素为白色则为 0,如果像素为黑色则为 1,将这些 0 和 1 连起来组成的字符串就构成了该字符图片的特征码。63.系统实现单纯的识别数字用如下程序实现:public class ImagePreProcess public static int isBlack(int colorInt) Color color = new Color(colorInt);if (color.getRed() + color.getGreen() + color.getBlue() 100) r

13、eturn 1;return 0;public static BufferedImage removeBackgroud(String picFile)throws Exception BufferedImage img = ImageIO.read(new File(picFile);int width = img.getWidth();int height = img.getHeight();7for (int x = 0; x splitImage(BufferedImage img)throws Exception List subImgs = new ArrayList();subI

14、mgs.add(img.getSubimage(10, 6, 8, 10);subImgs.add(img.getSubimage(19, 6, 8, 10);subImgs.add(img.getSubimage(28, 6, 8, 10);subImgs.add(img.getSubimage(37, 6, 8, 10);return subImgs;public static Map loadTrainData() throws Exception Map map = new HashMap();File dir = new File(“train“);File files = dir.

15、listFiles();for (File file : files) map.put(ImageIO.read(file), file.getName().charAt(0) + 8“);return map;public static String getSingleCharOcr(BufferedImage img,Map map) String result = “;int width = img.getWidth();int height = img.getHeight();int min = width * height;for (BufferedImage bi : map.ke

16、ySet() int count = 0;Label1: for (int x = 0; x = min)break Label1;if (count listImg = splitImage(img);Map map = loadTrainData();String result = “;for (BufferedImage bi : listImg) result += getSingleCharOcr(bi, map);ImageIO.write(img, “JPG“, new File(“result“+result+“.jpg“);return result;public stati

17、c void downloadImage() HttpClient httpClient = new HttpClient();GetMethod getMethod = new GetMethod(“http:/ (int i = 0; i trainMap = null;private static int index = 0;public static int isBlack(int colorInt) Color color = new Color(colorInt);if (color.getRed() + color.getGreen() + color.getBlue() 100

18、) return 1;return 0;public static BufferedImage removeBackgroud(String picFile)throws Exception BufferedImage img = ImageIO.read(new File(picFile);return img;public static BufferedImage removeBlank(BufferedImage img) throws Exception int width = img.getWidth();int height = img.getHeight();int start

19、= 0;int end = 0;Label1: for (int y = 0; y = 0; -y) for (int x = 0; x splitImage(BufferedImage img)throws Exception List subImgs = new ArrayList();int width = img.getWidth();int height = img.getHeight();List weightlist = new ArrayList();for (int x = 0; x 1) length+;if (length 12) subImgs.add(removeBl

20、ank(img.getSubimage(i - length - 1, 0,length / 2, height);subImgs.add(removeBlank(img.getSubimage(i - length / 2 - 1, 0,length / 2, height); else if (length 3) subImgs.add(removeBlank(img.getSubimage(i - length - 1, 0,length, height);return subImgs;public static Map loadTrainData() throws Exception

21、if (trainMap = null) Map map = new HashMap();File dir = new File(“train2“);File files = dir.listFiles();for (File file : files) map.put(ImageIO.read(file), file.getName().charAt(0) 14+ “);trainMap = map;return trainMap;public static String getSingleCharOcr(BufferedImage img,Map map) String result =

22、“;int width = img.getWidth();int height = img.getHeight();int min = width * height;for (BufferedImage bi : map.keySet() int count = 0;int widthmin = width = min)break Label1;if (count listImg = splitImage(img);Map map = loadTrainData();String result = “;for (BufferedImage bi : listImg) result += get

23、SingleCharOcr(bi, map);ImageIO.write(img, “JPG“, new File(“result2“ + result + “.jpg“);return result;public static void downloadImage() HttpClient httpClient = new HttpClient();GetMethod getMethod = null;for (int i = 0; i listImg = splitImage(img);if (listImg.size() = 4) 17for (int j = 0; j listImg.

24、size(); +j) ImageIO.write(listImg.get(j), “JPG“, new File(“train2“+ file.getName().charAt(j) + “-“ + (index+)+ “.jpg“);public static void main(String args) throws Exception / downloadImage();for (int i = 0; i 30; +i) String text = getAllOcr(“img2“ + i + “.jpg“);System.out.println(i + “.jpg = “ + tex

25、t);184.系统测试4.1 测试目的软件测试是程序的一种执行过程,目的是尽可能发现并改正被测试软件中的错误,提高软件的可靠性。它是软件生命周期中一项非常重要且非常复杂的工作,对软件可靠性保证具有极其重要的意义。在目前形式化的方法和程序正确性证明技术还无望成为实用性方法的情况下,软件测试在将来相当一段时间内仍然是软件可靠性保证的有效方法。软件工程的总目标是充分利用有限的人力和物力资源,高效率、高质量地完成软件开发项目。不足的测试势必使软件带着一些未揭露的隐藏错误投入运行,这将意味着更大的危险让用户承担。过度测试则会浪费许多宝贵的资源。到测试后期,即使找到了错误,然而付出了过高的代价。E.W.D

26、ijkstra 的一句名言说明了这一道理:“程序测试只能表明错误的存在,而不能表明错误不存在。”可见,测试是为了使软件中蕴涵的缺陷低于某一特定值,使产出、投入比达到最大。4.2 测试采用的方法本软件用的最多的就是黑盒测试,黑盒测试是通过测试来检测每个功能是否都能正常使用,是软件测试的主要方法之一,也可以称为功能测试、数据驱动测试或基于规格说明的测试。在测试中,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息。黑盒测试着眼于程序外部结构,不考虑内部

27、逻辑结构,主要针对软件界面和软件功能进行测试。194.3 测试结果1.运行初始小程序查看界面如下图 4.1 所示图 4.1 小应用程序2.识别单纯数字结果如下图 4.2 所示图 4.2 识别单一数字3.识别带背景且含字母的结果如下图 4.3 所示20图 4.3 识别含字母验证码4.识别带其他效果且含大写字母的验证码如下图 4.4 所示图 4.4 识别含大写字母验证码5.识别带横线数字的验证码如下图 4-5 所示图 4.5 识别带横线数字的验证码215.总结课程设计终于结束了,在这之前我对于图像处理这一块的开发是一点都不通的,但是我学习了之后还是将他搞定了,在整个开发过程中遇到了很多的问题,但最

28、终都一一解决。以前从没做过关于图像的编程,不知道关于图像的处理到底要怎么做,在网上看了大量的资料才慢慢了解图像处理方面的知识,慢慢的才开始逐步完成我的设计。在做设计的过程中有时会出现想象不到的错误,有的错误卡在那里让人很容易疯狂,因为找不到原因,不知道该怎么改错,所以编程的进度有时会很慢很慢,在网上看了大量的例程和说明之后才慢慢的将问题解决,网上的资源是非常好而且多的。这次的工程实训设计让我对以前的知识进行了巩固又对新的知识进行了积累,让我对以前的一些不太了解的地方通顺了很多,对于图像处理这方面的知识又有了新的掌握,使我获益良多。22参考文献1. 侯戬,通用车牌定位系统的研究与实现D.华南理工

29、大学,2011.2. 王永杰,裴明涛,贾云得.多信息融合的快速车牌定位J.中国图象图形学报,2014,3 3. 赵艳铎等(译). 数据库原理(第 5 版) M. 清华大学出版社, 2011 4. 杨冬青等(译). 数据库系统概念(第 6 版) M. 机械工业出版社, 20125. 金名等 (译). 数据库系统设计、实现与管理(第 8 版) M. 清华大学出版社, 20126. 杨建全,梁华,王成友.视频监控技术的发展与现状J.北京:自动化技术,2006,(21):84-917. 宋磊,黄徉林,沈兰荪 .视频监控系统概述J. 北京:测控技术,2003,(5):33 一358. 沈涛,曾连荪基于嵌

30、入式 Limix 的数字家庭监控系统研究 J.合肥:电脑知识与技术,20079. 刘富强.数字视频监控系统开发及应用 7M.北京:机械 L 业出版社,2012.10. 秦芳丽. 基于彩信的远程家庭防盗监控系统的研究D. 武汉理工大学, 2010.11. 余展然 , 彭楚武, 王鑫. 家用远程监控系统的设计与实现J. 安防科技, 2012 (2): 40-41.12. 张海藩.软件工程导论(第四、五版)M.北京:清华大学出版社,2003、2008.13. 苗春雷, 徐卫彬, 蔡玉宝, 等. 基于 GSM 模块的远程控制和报警系统J. 现代电子技术, 2012, 35(19): 5-7.14. 徐琳. 基于 ARM 及 GPRS 的远程入侵监控报警系统的设计D. 哈尔滨理工大学, 2011.

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 实用文档 > 说明文书

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报