识别验证码:寻找数字的位置(三)

1 没有意料的的问题

上回通过机器学习算法已经能够很好地找到那些图片里完整地存在数字,选择出这张图片有助于下一步识别图片中的数字,如果数字包含得都不完整,就不用说识别图片里的数字了。

红色边框表示算法判断存在数字

正如人有时很难在一小片图片中判断哪个图片里的数字最完整,算法会找到一小片包含数字的小方块,这些小方块都是彼此相邻的。因此下一步要做的事就是把一片判断包含数字的小方块组成一个组。

2 组成一组

必须保证是自左向右地去寻找,这样才能保证验证码里数字的顺序不会错乱。

def groupParts(predicted):
    """Assume predicted a boolean 2D array of representing a rectangle
    Group: area made up of adjacent Trues values
    Groups: all the group finding from left to the right"""
    partShape = predicted.shape
    looked = np.zeros(partShape,dtype=bool)
    nexts = [(1,0),(0,1),(-1,0),(0,-1)]
    groups = []
    for l in range(partShape[1]):
        for c in range(partShape[0]):
            if not looked[c,l]:
                looked[c,l] = True
                if predicted[c,l]:
                    group = []
                    fifo = [(c,l)]
                    while len(fifo)!=0:
                        tmp = fifo.pop(0)
                        looked[tmp[0],tmp[1]] = True
                        if predicted[tmp[0],tmp[1]]:
                            group.append((tmp[0],tmp[1]))
                            for n in nexts:
                                nextPos = (n[0]+tmp[0],n[1]+tmp[1])
                                if 0<=nextPos[0]<partShape[0] and 0<=nextPos[1]<partShape[1]:
                                    if not looked[nextPos[0],nextPos[1]]:
                                        looked[nextPos[0],nextPos[1]] = True
                                        fifo.append(nextPos)
                    groups.append(group)
    return groups

写得非常糟糕的一段程序。思路大致是这样的,在没有找到存在数字的小方块时,从左向右一列一列地寻找。查看过的小方块在looked数组里标记,以免重复查看。

一旦找到了存在数字的小方块,将上下左右的小方块保存在待查看的fifo列表里,每一次循环弹出一个小方块查看,如果包含数字就加入group列表,同时将上下左右的小方块保存在待查看的列表里,直至fifo为空。借鉴了一下图的广度优先搜索。

结果会是这样的:

Group 1:[(5, 3), (6, 3), (7, 3), (8, 3), (7, 4)]

Group 2:[(4, 8), (5, 8), (6, 8), (5, 9), (6, 9)]

Group 3:[(2, 13), (3, 13), (4, 13), (5, 13), (4, 14)]

Group 4:[(8, 13)]

Group 5:[(3, 18), (4, 18), (5, 18), (6, 18)]

Group 6:[(0, 23), (1, 23), (2, 23), (3, 23), (4, 23), (5, 23)]

3 对付误判

预测的算法精度不够,通常有一些误判,这样组Group有可能超过验证码数字的个数5。解决办法很简单,真正包含数字的组一般长度更长,找到长度最长的5个组就可以了。又是一段nasty的代码。

    groups = groupParts(partImgs,predict_contain.reshape(img.partNum))
    num_threshold = sorted(map(len,groups),reverse=True)[4]
    groups_filtered = filter(lambda x:len(x)>=num_threshold,groups)

一组相互毗邻的小方块代表一个数字,可以简单地选择出现最多的数字(众数),作为预测的结果。

时间: 2024-11-05 02:19:39

识别验证码:寻找数字的位置(三)的相关文章

识别验证码:寻找数字的位置(二)

有了数据,剩下的就是流水线上的活:利用某种机器学习算法学习得到模型,在用模型进行预测,评价模型的性能. 1 分割训练集和测试集 Python的机器学习包sklearn非常强大,它不仅包含了不论监督学习.非监督学习的算法,同时包括了进行常用预处理和其他流程的函数.分割训练集和测试集的函数虽然很简单,但也包含在sklearn包内. 通常情况下用X表示一定数目样本的特征数据,可以是Python的list类型,那么X是嵌套列表的列表,len(X)会是训练样本的数目,X[0]就是一个特征样本 通常用y表示

java识别验证码

所需资源下载链接(资源免费,重在分享) Tesseract:http://download.csdn.net/detail/chenyangqi/9190667 jai_imageio-1.1-alpha,swingx-1.0:http://download.csdn.net/detail/chenyangqi/9190683 HttpWatch Professional:http://download.csdn.net/detail/chenyangqi/9208339 项目简介: 我们学校使

BP神经网络识别手写数字项目解析及代码

这两天在学习人工神经网络,用传统神经网络结构做了一个识别手写数字的小项目作为练手.点滴收获与思考,想跟大家分享一下,欢迎指教,共同进步. 平常说的BP神经网络指传统的人工神经网络,相比于卷积神经网络(CNN)来说要简单些. 人工神经网络具有复杂模式和进行联想.推理记忆的功能, 它是解决某些传统方法所无法解决的问题的有力工具.目前, 它日益受到重视, 同时其他学科的发展, 为其提供了更大的机会.1986 年, Romelhart 和Mcclelland提出了误差反向传播算法(Error Back

C#识别验证码技术-Tesseract

相信大家在开发一些程序会有识别图片上文字(即所谓的OCR)的需求,比如识别车牌.识别图片格式的商品价格.识别图片格式的邮箱地址等等,当然需求最多的还是识别验证码.如果要完成这些OCR的工作,需要你掌握图像处理.图像识别的知识,需要用到图形形态学.傅里叶变换.矩阵变换.贝叶斯决策等很多复杂的理论,这让绝大部分人都会望而却步. Tesseract这个开源项目的出现让我们普通人也可以涉足OCR的开发.Tesseract可以从图片中识别出文字内容,但不要以为Tesseract可以智能的识别出各种奇形怪状

qtp识别验证码

花了两天时间才完整的完成识别验证码的登录操作,在网上看到很多关于验证码识别的方法,但是我用的qtp版本比较高级,所以还是要自己花心思研究.po上我的识别验证码的详细历程: 一.读取浏览器中的图片验证码 1.打开浏览器登录界面 2.启动qtp,不勾选web 3.录制验证码.开始录制:在录制的小条上选择insert ->text area output value. 截图验证码图片的框. 然后选择modify,output types设置为environment,name 可以改写为“getchar

一文全解:利用谷歌深度学习框架Tensorflow识别手写数字图片(初学者篇)

笔记整理者:王小草 笔记整理时间2017年2月24日 原文地址 http://blog.csdn.net/sinat_33761963/article/details/56837466?fps=1&locationNum=5 Tensorflow官方英文文档地址:https://www.tensorflow.org/get_started/mnist/beginners 本文整理时官方文档最近更新时间:2017年2月15日 1.案例背景 本文是跟着Tensorflow官方文档的第二篇教程–识别手

使用python识别验证码

公司的登录注册等操作有验证码,测试环境可以让开发屏蔽掉验证码,但是如果到线上的话就要想办法识别验证码或必过验证码了. 识别验证码主要分为三部分,一.对验证码进行二值化.二.将二值化后的图片分割.三.进行识别.理论上在识别之前有一个标准化的操作,是将图片进行旋转等操作,尽量将字符弄成一样的格式,方便识别,避免随进图片的差异. 用这个验证码作为例子:.下面是代码: 一.打开图片,将图片二值化. 图片是由RGB三个通道组成的,图片的验证码和他的干扰,比如点或横线等,RGB的阙值有很大的区别,我们可以使

用BP人工神经网络识别手写数字

http://wenku.baidu.com/link?url=HQ-5tZCXBQ3uwPZQECHkMCtursKIpglboBHq416N-q2WZupkNNH3Gv4vtEHyPULezDb50ZcKor41PEikwv5TfTqwrsQ4-9wmH06L7bYD04u 用BP人工神经网络识别手写数字 yzw20091201上传于2013-01-31|暂无评价|356人阅读|13次下载|暂无简介|举报文档 在手机打开 赖勇浩( http://laiyonghao.com ) 这是我读工

在VS2010下编译和使用tesseract_ocr识别验证码

对于自动识别验证码,使用trsseract是个不错的选择,有兴趣的的朋友可以试试. 编译tesseract 官网提供了vs2008的编译说明和工程,但在vs2010下的编译时基本相同的,因此我使用的方法就是把vs2008工程转换为vs2010工程, 同时把编译过程中遇到的问题以及解决方法和大家分享一下,希望对正准备使用trsseract库的朋友有所帮助. 下载代码 google code下载一下源代码,并建立build目录. tesseract-ocr-3.02.02.tar.gz   tess