1
背景
CAPTCHA的英文全称为Completely Automated Public Turing Test to Tell Computers and Humans Apart,译为“全自动区分计算机和人类的图灵测试”。测试手段多种多样,在图像领域用于测试的数字图像,从最初简单的黑白像素字符演变为包括多种颜色、噪声干扰、变形字体、旋转字体、以及实体识别、目标物标记与滑动操作等多种模式。

2
处理过程
图像处理作为预处理过程要完成区域定位、矫正分割,并依靠连通域分析、仿射变换、二值化处理、投影分析等技术实现。本文讨论的CAPTCHA测试,识别主体基本处于图像中央位置,因此省去了定位这一环节。整体处理过程大致需要以下步骤:

  1. 灰度与二值化,必要时配合去除噪声的操作;
  2. 图像分割与矫正;
  3. 识别字符。

刚接触图像处理的阶段,大家心里会有一个疑问:为什么总是要进行二值化处理?其实二值化是一个“化繁为简”的过程,多数情况下关注被研究物已经足够了,而其余信息是多余的。灰度将多通道信息变为单通道,再通过二值化保留关键信息用于后续的处理。

去除噪声的过程有时优先于二值化过程,有时在二值化过程之后,并且依据研究的问题不同,所使用的方法也不相同。本文使用的测试图片包含有效信息较少,因为存在减弱字符像素信息的风险,需谨慎使用滤波等常规方法消除噪声,而实际的去噪过程一般是利用图像自身特征来进行处理,例如根据通道特征、形态学特征、连通性特征等。

经历上述步骤后图像基本只剩下了关键的文本信息,接下来需要将字符文本分离出来。较简单的情形下,字符之间有明显的间隔即相互不连通,只需利用连通区间的检测就能将其分离。而有些情况,字符之间相互重叠覆盖导致较难进行分离,需要具备一定的边界检测能力,所使用的方法视问题而定。

最后利用模型进行字符图像的识别。此部分可以利用开箱即用的工具,也可以编码自建模型,还可以使用一些开放平台的接口能力。

3
实例说明
下面通过几组实例来做进一步说明:

例1
图像为纯字母组合,单个字符由多个轮廓叠加而呈现镂空状态且有两条水平方向干扰曲线。进一步我们不难发现其存在明显的色彩划分,通过RGB通道可以进行特征提取或者说是分离,进而留下有效信息,这里仅保留G通道信息即纯绿色信息。

可能大家会有疑问,图中绿色为干扰曲线的色彩特征,为何要保留噪声的信息?其实RGB三通道中每一个均为灰度通道,取值范围从0~255。绿色特征越明显说明其G通道灰度值越高、越接近白色,因此操作后绿色干扰线接近纯白。

而此时字符像素偏离G通道很远,因此灰度取值很小接近黑色。另一条干扰曲线同样偏离G通道,但灰度值与字符文本有比较明显的离散关系,经过灰度值反转,取适当的阈值进行二值化即可去除噪声并完成字符特征的提取。为了强化文本特征,尽量使其不连通部分相互连接,可进行一次“膨胀”操作,效果如下图所示:

通过多个样本观察可知,字符之间位置较固定且界限清晰,因此可通过定值切分的方式实现分割,那么剩下的就是字符的识别,这里通过开放平台进行接口调用识别率较好,不再赘述。

例2
图像的显著特点是字符有旋转并伴随短线段噪声。经过灰度、二值化过程后已经消除大部分背景干扰,再对其进行一次“开操作”去掉背景中的零星噪声点,如图所示:

下面进行图像分割与角度的矫正,首先找到所有连通区间并遍历集合,对每一个连通区域进行矩形拟合,利用矩形的最小外切圆最终确定切分边界,最后使用拟合角度做逆变换的旋转操作,达到分割与矫正的目的,如下所示:

矫正后的图像与原图相比规范了很多,利用开放平台接口能够得到比较理想的结果。

例3
图片分辨率较低、混合线段噪声与背景细小白噪声,直接使用常规滤波后字符的像素信息减弱比较明显。分析后发现分离HSV通道后,以S通道二值化后的图像为主,辅助V通道分量的一次“腐蚀”结果,再将两项合并进而得到比较干净的处理结果。

最后通过横轴投影积分完成分割。但“干净”只是相对来说,在下图中最后一个图像中还是保留了较明显的横线噪声。在噪声难以清理的情况下,字符文本的识别率会受到很大影响。本例采用自建模型来进行字符的识别。

模型采用Keras框架(后端为tensorflow)定制神经网络,由包含4个隐含层的全连接网络组成深度学习模型。增减网络层数、调节节点数量会不同程度的影响识别效果,调整参数最终达到自身要求即可,当然也可以应用如SVM、感知机等机器学习模型来做分类器。模型的示例代码如下:
data_train, lable_train = load_data(’\captcha\train’)
model = Sequential()
model.add(Dense(input_dim=15*20, units=1024, activation=‘relu’))
model.add(Dense(units=512, activation=‘relu’))
model.add(Dense(units=256, activation=‘relu’))
model.add(Dense(units=256, activation=‘relu’))
model.add(Dense(units=128, activation=‘relu’))
model.add(Dense(units=30, activation=‘softmax’))
model.compile(loss=‘categorical_crossentropy’,optimizer=‘adam’,metrics=[‘accuracy’])
model.fit(data_train, lable_train, batch_size=50, epochs=15)

4
总结
图像处理作为前置过程,为后端识别工作提供必要的数据处理能力。而上面讨论的处理过程,仍属于传统图像处理方式,随着深度学习理论与实践的不断更迭,趋势会逐渐过渡到文本行检测与文字识别的整体深度学习阶段。在实际应用中要视情况制定具体的处理方案,善于针对问题进行分析与测试。
文 / Bob
编辑 / Elsie

关于未名企鹅

未名企鹅以“连接健康”为使命,致力于提供生命健康领域的大数据产品和解决方案,帮助客户实现数据驱动的业务增长。

公司创始人邹晓亮先生是北大博士,前腾讯高管。创始团队主要成员均曾在腾讯、阿里巴巴、网易工作多年,同时结合了来自医药行业经验丰富的人士和业内具有丰富经验的专家顾问团队。公司技术团队中有数十位研发人员均来自腾讯,互联网技术基因和产品文化底蕴深厚。

未名企鹅成立以来获得由经纬中国、成为资本、红石诚金分别领投的三轮累计数亿元融资。

未名企鹅极客 | 人机图灵测试中数字图像处理方法研究相关推荐

  1. 未名企鹅极客 | 医药数据管理中的短文本高效匹配技术

    大量行业数据.渠道流向数据在清洗的过程中,面临着诸多极大耗费人力的问题.在数据来源多样且格式不统一的情况下,人工匹配曾让很多信息员闻之色变.即使在人工智能和机器学习的时代下,由于各种原因导致的匹配误差 ...

  2. 未名企鹅极客 | Kylin Cube构建优化(上)

    Kylin Cube构建优化 联机分析处理OLAP是一种软件技术,它使分析人员能够迅速.一致.交互地从各个方面观察信息,以达到 深入理解数据的目的. 多维数据组织OLAP的使用一般有两种背景条件: Ø ...

  3. ​未名企鹅极客 | 流向处理新技术

    未名企鹅做为医药产业互联网和大数据解决方案专家,在帮助企业客户处理流向数据的过程不可避免的要面对如何处理大量的数据问题.虽然说数据处理一个老话题,但是时代在变化,技术在进化,解决的问题思路也需要与时俱 ...

  4. 未名企鹅极客 | 医药流向的数据仓库建模

    关于医药流向数据,在实际处理的过程当中涉及到数据仓库的建模.未名企鹅的研发工程师Lee在此提供一些建模的思路和心得.首先我们来熟悉一些概念和定义解释. 01 什么是数据建模? 数据建模,就是设计数据的 ...

  5. 用一根网线颠覆传统教育,这名计算机极客如何变成了数学教父,拒绝10个亿?...

    点击上方"程序员大咖",选择"置顶公众号" 关键时刻,第一时间送达! 来源:51CTO官微 程序员大咖整理发布,转载请联系作者获得授权 在这个金钱至上的年代,他 ...

  6. Weex实战分享|Weex在极客时间APP中的实践

    本文是根据 WeexConf2018 中议题<Weex在极客时间APP中的实践>内容文档整理而成.主要分享极客时间在深度使用Weex过程中的一些经验和体会. 孙涛  极客邦前端负责人 大家 ...

  7. 数字图像处理——实验一 Python中数字图像处理的基本操作

    数字图像处理--实验一 Python中数字图像处理的基本操作 一.实验目的 二.实验主要仪器设备 三.实验原理 3.1 数字图像的表示和类别 3.2 opencv-python图像文件格式 四.实验内 ...

  8. php 取字符串中的字母数字,php如何提取字符串中的数字?php提取字符串中数字的方法总结(附代码)...

    本篇文章给大家带来的内容是关于php如何提取字符串中的数字?php提取字符串中数字的方法总结(附代码) ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. PHP提取字符串中的第一组数字 ...

  9. php 解析字符串提取数字,php实现提取字符串中数字的方法总结(代码)

    这篇文章给大家介绍的内容是关于php实现提取字符串中数字的方法总结(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. PHP提取字符串中的第一组数字<?php $str=' ...

最新文章

  1. 《深入理解Nginx:模块开发与架构解析》一1.2 为什么选择Nginx
  2. python 绘制柱状图-Python使用Plotly绘图工具,绘制柱状图
  3. java Math类中的pow方法的问题Math.pow(64,1/3)是1而不是4
  4. Winrar目录穿越漏洞复现
  5. 在C#的类库中使用log4net
  6. exp-imp实现oracle不同表空间的迁移
  7. jsoncpp-src-0.5.0.tar.gz 源码错误!!!!
  8. python unpack_ip地址处理每天10行python代码系列
  9. 光纤收发器让网络布线变的更方便
  10. 7. 稀疏表示之OMP,SOMP算法及openCV实现
  11. 经济学原理曼昆第八版课后习题答案
  12. AspUpload中文手册及语法
  13. 【Get深一度】信号处理(三)——3db带宽
  14. 计算机管理的服务打不开,Windows 系统服务无法打开解决方法+操作命令详解
  15. 抖音seo源码二次开发 抖音seo源码二次开发
  16. 十大概念:每个软件工程师的必备
  17. sticky-粘性布局
  18. navicat premium 快捷键
  19. 史上最全超级金融知识(珍藏版)
  20. 全面解析软文营销中的八大技巧

热门文章

  1. 2022年全球智能盆栽行业分析报告
  2. 云虚拟主机bch 和 云服务器bcc,云虚拟主机bch和云服务器bcc
  3. word 去除页眉默认的横线及python操作分析
  4. TNW:Tumblr博文已超200亿
  5. mysql netcdf_NetCDF Overview
  6. .js文件中的下划线
  7. 钱与情,钱与人,钱与命
  8. spring boot V部落 V人事项目
  9. 怎么删除win10的系统更新服务器,教你怎么永久删除Win10更新助手(Update Assistant)...
  10. Android——横幅通知