背景:朋友在为"关山口男子职业技术学校"写一款校园应用,于是找MoonXue写一个学生选课系统的登录接口.为了搞定这个接口,不得不先搞定这个系统的验证码.

验证码大概是这个样子

看上去不怎么难,没有干扰线没有粘连没有扭曲.但还是没能用pytesser直接将它识别出来,因为当中有噪点和其他背景噪声的存在.MoonXue的工作就是去掉这些讨厌的东西

先介绍一下,我们的工具:

1.Pytesser  它是基于一个c语言实现名为tesser的识别工具的python封装.可惜比较笨,只能做最简单的识别而且不认识汉字

2.Requests  它是我们喜欢写爬虫的孩子的最爱,提供人性化的接口,代价是失去了一点效率(写python就别考虑效率啦)

3.BeautifulSoup  它和Requests是一对好机油,让提取文档中所需的内容变成一件简单的事情

4.PIL      它是今天的主角,PIL是专门用作图像处理的库,很好很强大.熟练的人甚至可以用它来P图

如何写爬虫去实现模拟登录此处不细说,下面说说怎么解决验证码识别

解决思路如下:

1.先用PIL对图像做一次图像增强,因为原图中数字的边缘和背景中的噪声并不是太分明,做了增强之后能将两者分离.如果不分离,可能会在去噪点的时候导致数字中有部分会缺失

im = Image.open("randomimage/randomImage11.jpg")

im= ImageEnhance.Sharpness(im).enhance(3)

参数为3是经过实验之后感觉比较理想的值,太强不好,太弱也不好

2.做完预处理之后,就是去背景噪声了.背景噪声指的是背景中各种明暗变换的色块,肉眼也许不会注意到这个.但是它的存在会给识别带来影响.我最初的做法是将图像转换为只有黑白两色,这样自然就将噪声转换成了噪点.

效果如图

但我希望能去掉噪点,成为这样

最先想到的是种子染色法 ,什么是种子染色法请参看这个链接

为了防止坏链,此处做部分转载

种子染色法英文叫做Flood Fill ,实际上Flood Fill这个名称更贴切一点,因为这个方法作用在一个图的结点上时恰似洪水一样“淹没”与之相连的其他结点并以相同的方式蔓延出去,这个方法通常用于计算一个图的极大连通子图(这里的“图”是图论的概念)。设想一个无向图,我们从这个图中一个未标号(“标号”可以理解为“染色”)的结点开始,将此结点和从这个结点出发可达的所有结点都赋予相同的标号(染上相同的颜色),那么我们就得到了这些被标号的结点所组成的一个极大连通子图,搜索下一个未标号的结点并重复上述过程我们便可以找到所有的极大连通子图。“染色”的过程可以用DFS或者BFS实现,如果结点数为V,边数为E,因为我们在Flood Fill过程中“造访”每个结点两次,“造访”每条边两次,所以得到所有极大连通子图的时间复杂度为o(V+E) 。

想象每个白色方块为图中的结点,相邻的方块(上下左右)有边相连,那么这个图就有三个极大连通子图,这演示了Flood Fill查找其中一个极大连通子图的过程。

在这是借要用种子染色法计算每块的面积,然后把小体积的块当作噪点去除.

代码在这

defcheck(j,i):try:if pix[j,i] == 0 and matrix[j][i] != -1:returnTrueelse:returnFalseexcept:returnFalsedefjuli(r,s):return abs(r[0]-s[0])+abs(r[1]-s[1])+abs(r[2]-s[2])for i inrange(w):for j inrange(h):

r=[0,0,0]

s=[0,0,0]if pix[j,i] ==0:if check(j-1,i):

r[0],r[1],r[2] =im2.getpixel((j,i))

s[0],s[1],s[2] = im2.getpixel((j-1,i))printrprintsprint "-"*55

if juli(r,s) <=l:

matrix[j][i]= matrix[j-1][i]

maps[str(matrix[j][i])]+=1

elif check(j-1,i-1):

r[0],r[1],r[2] =im2.getpixel((j,i))

s[0],s[1],s[2] = im2.getpixel((j-1,i-1))if juli(r,s) <=l:

matrix[j][i]= matrix[j-1][i-1]

maps[str(matrix[j][i])]+=1

elif check(j,i-1):

r[0],r[1],r[2] =im2.getpixel((j,i))

s[0],s[1],s[2] = im2.getpixel((j-1,i))if juli(r,s) <=l:

matrix[j][i]= matrix[j][i-1]

maps[str(matrix[j][i])]+=1

elif check(j+1,i+1):

r[0],r[1],r[2] =im2.getpixel((j,i))

s[0],s[1],s[2] = im2.getpixel((j+1,i+1))if juli(r,s) <=l:

matrix[j][i]= matrix[j+1][i+1]

maps[str(matrix[j][i])]+=1

elif check(j,i+1):

r[0],r[1],r[2] =im2.getpixel((j,i))

s[0],s[1],s[2] = im2.getpixel((j,i+1))if juli(r,s) <=l:

matrix[j][i]= matrix[j][i+1]

maps[str(matrix[j][i])]+=1

elif check(j-1,i+1):

pr[0],r[1],r[2] =im2.getpixel((j,i))

s[0],s[1],s[2] = im2.getpixel((j-1,i+1))if juli(r,s) <=l:

matrix[j][i]= matrix[j-1][i+1]

maps[str(matrix[j][i])]+=1

elif check(j+1,i-1):

r[0],r[1],r[2] =im2.getpixel((j,i))

s[0],s[1],s[2] = im2.getpixel((j+1,i-1))if juli(r,s) <=l:

matrix[j][i]= matrix[j+1][i-1]

maps[str(matrix[j][i])]+=1

elif check(j+1,i):

r[0],r[1],r[2] =im2.getpixel((j,i))

s[0],s[1],s[2] = im2.getpixel((j+1,i))if juli(r,s) <=l:

matrix[j][i]= matrix[j+1][i]

maps[str(matrix[j][i])]+=1

else:

n+=1maps[str(n)]=1matrix[j][i]=nfor i inrange(w):for j inrange(h):if matrix[j][i]!=-1 and maps[str(matrix[j][i])]<=2:

im.putpixel((j,i),255)

View Code

结果呢,不是很理想因为这个体积参数设小了,噪点没去干净,设大了数字部分可能也去了一小块.最重要的是这里噪点的大小不是很规律,很难找到一个不错的面积参数.

失败只是暂时的,经过观察发现背景噪声颜色明显比数字要浅的多.这也意味着它的RGB值要比数字小的多,通过分析RGB值能去掉大部分噪声,剩下来的噪点可以再通过种子染色法处理.也就是说,分别在两张图片(分别是黑白和彩色)上获取信息,在一张图片上做处理最后做识别

核心代码在这

r[0],r[1],r[2] =im2.getpixel((j,i))if r[0]+r[1]+r[2]>=400 or r[0]>=250 or r[1]>=250 or r[2]>=250:

im2.putpixel((j,i),(255,255,255))

至此,本次识别的问题就搞定啦,成功率在50%以上基本满足接口的需求

想交流或想要源码的朋友可以邮件联系

python去除噪点_如何用python搞定验证码中的噪点相关推荐

  1. python 矩阵运算 for循环_如何用 Python 科学计算中的矩阵替代循环

    展开全部 因为在Mathematica中使用循环确实是低效的.32313133353236313431303231363533e78988e69d8331333361313961..... 深层次的原 ...

  2. python贪吃蛇控制台_如何用Python写一个贪吃蛇AI

    前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过.但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势的地方了. 问题的关键在于,图片中的贪吃蛇真的很贪吃XD, ...

  3. python搭建自动化测试平台_如何用python语言搭建自动化测试环境

    原标题:如何用python语言搭建自动化测试环境 技术分享:基于Python语言的Web自动化测试环境搭建 近期发现很多初学者在学习自动化的过程当中,在环境安装环节总是出现问题,所以详细的出一篇环境搭 ...

  4. 如何制作python检查小软件_如何用Python制作整蛊小程序

    原标题:如何用Python制作整蛊小程序 下面的整蛊程序,千万不要发代码,否则就实现不了你整蛊的目的了.完成后一定要打包成一个exe程序,再发给朋友使用 . 1. 使用 pip install pyi ...

  5. python rest api 测试_如何用Python编写REST API的单元测试

    在过去的几个月中,正在从事一个名为B的项目.它是带有简单Web UI的徽章生成器,用于添加数据并生成PDF可打印徽章.B后端现在已转移到REST-API并测试REST-API中使用的功能,我们需要一些 ...

  6. python的out模式_如何用python中的DataFrame列的模式替换NA值?

    我对Python(和本网站)完全陌生,目前正试图用它们的模式替换特定数据帧列中的NA值.我试过了各种不起作用的方法.请帮我看看我做错了什么:如何用python中的DataFrame列的模式替换NA值? ...

  7. 用python做一张图片_如何用python下载一张图片

    如何用python下载一张图片 这里要用到的主要工具是requests这个工具,需要先安装这个库才能使用,该库衍生自urllib这个库,但是要比它更好用.多数人在做爬虫的时候选择它,是个不错的选择. ...

  8. 用python处理excel表格_如何用python处理excel数据 | 用python处理excel表格数据类型

    python 读取EXCEL文件中的数据格式 扩展库 xlrd 读excle xlwt 写excle 直上搜就能下载 下载后使用 import xlrd 就可以读excle了 打开文件: xls = ...

  9. python turtle画动物_如何用python画简单的动物

    首先来看一下实现效果,如下图:程序猿的生活:Python入门到精通资料大汇总,不啰嗦,全是珍藏资料!​zhuanlan.zhihu.com 具体实现代码请看: # -*- coding:utf-8 - ...

最新文章

  1. 【动态规划】装箱问题
  2. python 并行计算 并行方法总结 concurrent.futures pp pathos multiprocessing multiprocess模块 总结对比
  3. php和python学哪个-php和python哪个
  4. 远程代理模式-Remote Proxy(Java实现)
  5. cordova sqlite
  6. 配置Apache服务器的PHP运行环境
  7. kafka-manager 安装
  8. [leetcode] 140. 单词拆分 II
  9. 福大软工1816:Alpha(5/10)
  10. 莫烦python视频顺序_莫烦Python视频笔记
  11. 数学建模思路模板经典案例(看完快速入门)
  12. 软件we端压力测试,软件压力测试报告
  13. 2021京东618活动脚本App和电脑版最新版(建议使用app版)
  14. php注册登录描述,基于PHP实现用户登录注册功能的详细教程
  15. 返回多字段并用数组分割方式展示
  16. 3dmax安装后破解Couldn't write to disk !
  17. Vivado软件的使用
  18. 苹果平板做ppt方便吗_有没有苹果手机和安卓平板之间方便复制粘贴的工具啊?...
  19. 正整数n分解成若干个个不同的自然数之和,使得乘积最大
  20. 2022年中国医疗设备电源市场现状研究分析与发展前景预测报告

热门文章

  1. FSC-COC供应链管理体系认证、认证培训标准、审核清单、认证公司
  2. 利用Cobalt Strike通过exe木马实现远控|Cobalt Strike远程控制|Cobalt Strike 使用方法|CS使用方法
  3. 完全用 Linux 工作
  4. C语言-- 输入三角形的三边长,求三角形的面积。
  5. ios 输入法扩展_如何给iOS系统原生输入法导入词库
  6. 流媒体技术服务器常用部署方式
  7. VB程序设计教程(第四版)龚沛曾-实验8-7
  8. mapinfo的tab图层汉字乱码_如何解决MapInfo打开文字乱码的问题
  9. linux bsp笔试题,Linux BSP工程师面试常问问题汇集.pdf
  10. 执行修订 第十五篇 墨客区块链(MOAC BlockChain) 搭建自己的第一个DAPP