字符图片_6个像素,相对比较_删_的验证码图片已经生成,然后就能得到被切割的_蛹_的图片元素了,我们也可以将这些图片分解到_蛹_ 有97%新玩家认为验证码 识别 代码(验证码识别代码)值得一读!
{image}
4条解答一.pixel图片素材如何利用Python做简单的验证码识别
pixelstudio导入照片大小
1.
首先我们打开软件,点击下方工具栏中的添加图片功能 。
2.
然后就可以从素材库中直接添加图片,同时点击下方的从设备还可以导入手机中的图片。
3.
点击从设备后,可以导入手机中储存的像素图,也可以直接导入相册中的照片,不过需要将大小控制在256*256像素以内。
4.
如图,导入图片素材后可以对其进行大小和位置的调整
如何保存pixel壁纸内的图片
用PixelStylePhotoEditor,您可以将图像文档保存为TIFF/JPEG/PNG/GIF/BMP/PSDB/JPEG2000/PDF/SVG格式 。
第一步:选择菜单栏中的“文件 ”—>“存储” 。
第二步:弹出“存储”对话框中,键入图像的名称。
第三步:选择要保存的文件格式。
可导出的文件格式和对应的选项 。
提示:
1.如果您尚未编辑完成并希望下次无损打开该文件,请将文档另存为PixelStyle图像(PSDB)。
第四步:单击“保存 ”按钮保存对文档的更改。
如何利用Python做简单的验证码识别
1__
验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的_阑鹎_功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越来越严峻 。本文介绍了一套字符验证码识别的完整流程,对于验证码安全和OCR识别技术都有一定的借鉴意义。
然后经过了一年的时间,笔者又研究和get到了一种更强大的基于CNN卷积神经网络的直接端到端的验证识别技术(文章不是我的,然后我把源码整理了下,介绍和源码在这里面):
基于python语言的tensorflow的‘端到端’的字符型验证码识别源码整理(github源码分享)
2__丶
关键词:安御链全,字符图片,验证码识别,OCR,Python,SVM,PIL
3__庠鹕
本文研究所用素材来自于某旧Web框架的网站_耆酝夤_的公共图片资源。
本文只做了该网站对外公开的公共图片资源进行了爬取,_⑽丛饺_做任何多余操作 。
本文在书写相关报告的时候已经_漏洞网站的身份信息。
本文作者_丫ㄖ_网站相关人员此系统漏洞,并积极向新系统转移。
本报告的主要目的也仅是用于_CR交流学习_鸵鸫蠹叶_验证安全的警觉_
4__
关于验证码的非技术部分的介绍,可以参考以前写的一篇科普类的文章:
互联网安全防火墙(1)--网络验证码的科普
里面对验证码的种类,使用场景,作用,主要的识别技术等等进行了讲解,然而并没有涉及到任何技术内容 。本章内容则作为它的_际醪钩_来给出相应的识别的解决方案,让读者对验证码的功能及安全性问题有更深刻的认识。
5__竟ぞ
要达到本文的目的,只需要简单的编程知识即可,因为现在的机器学习领域的蓬勃发展,已经有很多封装好的开源解决方案来进行机器学习。普通程序员已经不需要了解复咐拆码杂的数学原理,即可以实现对这些工具的应用了 。
主要开发环境:
python3.5
pythonSDK版本
PIL
图片处理库
libsvm
开源的svm机器学习库
关于环境的安装,不是本文的重点,故略去 。
6__玖鞒
一般情况下,对于字符型验证码的识别流程如下:
准备原始图片素材
图片预处理
图片字符切割
图片尺寸归一化
图片字符标记
字符图片特征提取
生成特征和标记对应的训练数据衡哪集
训练特征标记数据生成识别模型
使用识别模型预测新的未知图片集
达到根据“图片 ”就能返回识别正确的字符集的目标
7__夭淖急
7.1__夭难≡
由于本文是以初级的学习研究目的为主,要求_坝写硇,但又不会太难”,所以就直接在网上找个比较有代表性的简单的字符型验证码(感觉像在找漏洞一样)。
最后在一个比较旧的网站(估计是几十年前的网站框架)找到了这个验证码图片。
原始图:
放大清晰图:
此图片能满足要求,仔细观察其具有如下特点 。
有利识别的特点:
由纯阿拉伯数字组成
字数为4位
字符排列有规律
字体是用的统一字体
以上就是本文所说的此验证码简单的重要原因,后续代码实现中会用到
不利识别的特点:
图片背景有干扰噪点
这虽然是不利特点,但是这个干扰门槛太低,只需要简单的方法就可以除去
7.2__夭幕袢
由于在做训练的时候,需要大量的素材,所以不可能用手工的方式一张张在浏览器中保存,故建议写个自动化下载的程序。
主要步骤如下:
通过浏览器的抓包功能获取随机图片验证码生成接口
批量请求接口以获取图片
将图片保存到本地磁盘目录中
这些都是一些IT基本技能,本文就不再详细展开了。
关于网络请求和文件保存的代码,如下:
defdownloads_pic(**kwargs):
pic_name=('pic_name',None)
url='httand_code_captcha/'
res=(url,stream=True)
withopen(pic_path+pic_name+'.bmp','wb')asf:__forchunkin_content(chunk_size=1024):ifchunk:#filteroutkeep- alivenewchunks_(chunk)
()
()
循环执行N次,即可保存N张验证素材了 。
下面是收集的几十张素材库保存到本地文件的效果图:
8__计ご_
虽然目前的机器学习算法已经相当先进了,但是为了减少后面训练时的复杂度,同时增加识别率,很有必要对图片进行预处理,使其对机器识别更友好。
针对以上原始素材的处理步骤如下:
读取原始图片素材
将彩色图片二值化为黑白图片
去除背景噪点
8.1__祷计
主要步骤如下:
将RGB彩图转为灰度图
将灰度图按照设定阈值转化为二值图
image=(img_path)
imgry=('L')#转化为灰度图table=get_bin_table()
out=(table,'1')
上面引用到的二值函数的定义如下:
def_et_bin_table(threshold=140):"""获取灰度转二值的映射table:paramthreshold::return:"""__table=]__for__n_ange(256):_if<threshold:_(0)_else:(1)eturn_able
由PIL转化后变成二值图片:0表示黑色,1表示白色。二值化后带噪点的6937_南袼氐闶涑龊笕缦峦:
如果你是近视眼,然后离屏幕远一点,可以隐约看到6937_墓羌芰恕
8.2__コ氲
在转化为二值图片后,就需要清除噪点 。本文选择的素材比较简单,大部分噪点也是最简单的那种_铝⒌,所以可以通过检测这些孤立点就能移除大量的噪点。
关于如何去除更复杂的噪点甚至干扰线和色块,有比较成熟的算法:_樗畛浞_loodFill,后面有兴趣的时间可以继续研究一下。
本文为了问题简单化,干脆就用一种简单的自己想的_虻グ旆_来解决掉这个问题:
对某个_诘_周边的九宫格里面的黑色点计数
如果黑色点少于2个则证明此点为孤立点,然后得到所有的孤立点
对所有孤立点一次批量移除 。
下面将详细介绍关于具体的算法原理。
将所有的像素点如下图分成三大类
顶点A
非顶点的边界点B
内部点C
种类点示意图如下:
其中:
A类点计算周边相邻的3个点(如上图红框所示)
B类点计算周边相邻的5个点(如上图红框所示)
C类点计算周边相邻的8个点(如上图红框所示)
当然,由于基准点在计算区域的方向不同,A类点和B类点还会有细分:
A类点继续细分为:左上,左下,右上,右下
B类点继续细分为:上,下,左,右
C类点不用细分
然后这些细分点将成为后续坐标获取的准则。
主要算法的python实现如下:
defsum_9_region(img,x,y):_"""
9邻域框,以当前点为中心的田字框,黑点个数
:paramx:
:paramy:
:return:_"""
todo判断图片的长宽度下限
cur_pixel=((x,y))#当前像素点的值
width=
height=_ifcur_pixel==1:#如果当前点为白色区域,则不统计邻域值
return0_ify==0:#第一行
ifx==0:#左上顶点,4邻域
中心点旁边3个点
sum=cur_pixel\_+((x,y+1))\_+((x+1,y))\_+((x+1,y+1))return4-sum__elifx==width-1:#右上顶点
sum=cur_pixel\_+((x,y+1))\_+((x-1,y))\_+((x-1,y+1))return4-sum__else:#最上非顶点,6邻域
sum=((x-1,y))\_+((x-1,y+1))\+cur_pixel\_+((x,y+1))\+((x+1,y))\_+((x+1,y+1))return6-sum_elify==height-1:#最下面一行
ifx==0:#左下顶点
中心点旁边3个点
sum=cur_pixel\_+((x+1,y))\_+((x+1,y-1))\_+((x,y-1))return4-sum__elifx==width-1:#右下顶点
sum=cur_pixel\_+((x,y-1))\_+((x-1,y))\_+((x-1,y-1))return4-sum__else:#最下非顶点,6邻域
sum=cur_pixel\_+((x-1,y))\+((x+1,y))\_+((x,y-1))\+((x-1,y-1))\_+((x+1,y-1))return6-sum_else:#y不在边界
ifx==0:#左边非顶点
sum=((x,y-1))\_+curpixel\+((x,y+1))\_+((x+1,y-1))\+((x+1,y))\_+((x+1,y+1))___return6-sum__elifx==width-1:#右边非顶点
print('%s,%s'%(x,y))
sum=((x,y-1))\_+curpixel\+((x,y+1))\_+((x-1,y-1))\+((x-1,y))\_+((x-1,y+1))___return6-sum__else:#具备9领域条件的
sum=((x-1,y-1))\_+((x-1,y))\+((x-1,y+1))\_+((x,y-1))\+cur_pixel\_+((x,y+1))\+((x+1,y-1))\_+((x+1,y))\+((x+1,y+1))___return9-sum
Tips:这个地方是相当考验人的细心和耐心程度了,这个地方的工作量还是蛮大的,花了半个晚上的时间才完成的 。
计算好每个像素点的周边像素黑点(注意:PIL转化的图片黑点的值为0)个数后,只需要筛选出个数为1或者2_牡愕淖昙次_孤立点_U飧雠卸戏椒?赡懿惶既,但是基本上能够满足本文的需求了 。
经过预处理后的图片如下所示:
对比文章开头的原始图片,那些_铝⒌_都被移除掉,相对比较_删_的验证码图片已经生成。
9__计址懈
由于字符型_橹ぢ胪计_本质就可以看着是由一系列的_ジ鲎址计_拼接而成,为了简化研究对象,我们也可以将这些图片分解到_蛹_,即:_话ジ鲎址耐计
于是,我们的研究对象由__种字串的组合对象”涑“10种阿拉伯数字 ”拇,极大的简化和减少了处理对象。
9.1__指钏惴
现实生活中的字符验证码的产生千奇百怪,有各种扭曲和变形 。关于字符分割的算法,也没有很通用的方式。这个算法也是需要开发人员仔细研究所要识别的字符图片的特点来制定的。
当然,本文所选的研究对象尽量简化了这个步骤的难度,下文将慢慢进行介绍 。
使用图像编辑软件(PhoneShop或者其它)打开验证码图片,放大到像素级别,观察其它一些参数特点:
可以得到如下参数:
整个图片尺寸是40*10
单个字符尺寸是6*10
左右字符和左右边缘相距2个像素
字符上下紧挨边缘(即相距0个像素)
这样就可以很容易就定位到每个字符在整个图片中占据的像素区域,然后就可以进行分割了,具体代码如下:
defget_crop_imgs(img):_"""
按照图片的特点,进行切割,这个要根据具体的验证码来进行工作.#见原理图
:paramimg:
:return:_"""
child_img_list=[]_foriinrange(4):
x=2+i*(6+4)#见原理图
y=0
child_img=((x,y,x+6,y+10))
child_img_(child_img)_returnchild_img_list
然后就能得到被切割的_蛹_的图片元素了:
9.2__谌菪〗
基于本部分的内容的讨论,相信大家已经了解到了,如果验证码的干扰(扭曲,噪点,干扰色块,干扰线)做得不够强的话,可以得到如下两个结论:
4位字符和位字符的验证码区别不大
纯字母
不区分大小写。分类数为26
区分大小写。分类数为52
纯数字 。分类数为10
数字和区分大小写的字母组合。分类数为62
纯数字__数字及字母组合_难橹ぢ肭鸩淮
在没有形成_甘痘蛘呒负渭_的难度增加,而只是_咝杂邢藜_增加计算量时,意义不太大。
10__叽绻橐
本文所选择的研究对象本身尺寸就是统一状态:6*10的规格,所以此部分不需要额外处理 。但是一些进行了扭曲和缩放的验证码,则此部分也会是一个图像处理的难点。
11__P脱盗凡街
在前面的环节,已经完成了对单个图片的处理和分割了。后面就开始进行_侗鹉P_的训练了 。
整个训练过程如下:
大量完成预处理并切割到原子级的图片素材准备
对素材图片进行人为分类,即:打标签
定义单张图片的识别特征
使用SVM训练模型对打了标签的特征文件进行训练,得到模型文件
12__夭淖急
本文在训练阶段重新下载了同一模式的4数字的验证图片总计:3000张 。然后对这3000张图片进行处理和切割,得到张原子级图片。
在这张图片中删除一些会影响训练和识别的强干扰的干扰素材,切割后的效果图如下:
13__夭谋昙
由于本文使用的这种识别方法中,机器在最开始是不具备任何数字的观念的。所以需要人为的对素材进行标识,告诉_魇裁囱耐计哪谌菔1 。
这个过程叫做_氨昙恰薄
具体打标签的方法是:
为0~9每个数字建立一个目录,目录名称为相应数字(相当于标签)
人为判定_计谌,并将图片拖到指定数字目录中
每个目录中存放100张左右的素材
一般情况下,标记的素材越多,那么训练出的模型的分辨能力和预测能力越强。例如本文中,标记素材为十多张的时候,对新的测试图片识别率基本为零,但是到达100张时,则可以达到近乎100%的识别率
14__卣餮≡
对于切割后的单个字符图片,像素级放大图如下:
从宏观上看,不同的数字图片的本质就是将黑色按照一定规则填充在相应的像素点上,所以这些特征都是最后围绕像素点进行。
字符图片_6个像素,高10个像素,理论上可以最简单粗暴地可以定义出60个特征:60个像素点上面的像素值 。但是显然这样高维度必然会造成过大的计算量,可以适当的降维。
通过查阅相应的文献_2],给出另外一种简单粗暴的特征定义:
每行上黑色像素的个数,可以得到10个特征
每列上黑色像素的个数,可以得到6个特征
最后得到16维的一组特征,实现代码如下:
defget_feature(img):_"""
获取指定图片的特征值,
1.按照每排的像素点,高度为10,则有10个维度,然后为6列,总共16个维度
:paramimg_path:
:return:一个维度为10(高度)的列表_"""
width,height=
pixel_cnt_list=[]
height=10_foryinrange(height):
pix_cnt_x=0__forxinrange(width):___if((x,y))==0:#黑色点
pix_cnt_x+=1
pixel_cnt_(pix_cnt_x)_forxinrange(width):
pix_cnt_y=0__foryinrange(height):___if((x,y))==0:#黑色点
pix_cnt_y+=1
pixel_cnt_(pix_cnt_y)_returnpixel_cnt_list
然后就将图片素材特征化,按照_ibSVM_付ǖ母袷缴梢蛔榇卣髦岛捅昙侵档南蛄课
二.如何做到C程序进行验证码识别
如果是简单的图片验证码 ,上面仅是数字与字母,可以使用OCR识别生成验证码可以查看以下代码:
/产生验证码/
public string createcode(int codelength)
{
string code = "";
random rand = new random();
for (int i = 0; i < codelength; i++)
{
code += (char)(65, 90);
}
return code;
}
然后在使用的时候把它加到 session里就可以了啊
string checkcode = createcode(6); session["checkcode"] = checkcode;
最后比较 session里的值和用户输入的值
三.电子邮件的确认代码是什么东东
您好,如果您是登陆邮箱让您填写验证码 ,验证码就在让您填的哪个格旁边 ,是几个数字例如2654之类的数字,填进去按确定就行啦。请您仔细看看 。就是在登陆的时候旁边那个数字。你是你在登陆窗口的右下边有一个由字母或数字组成的代码。
四.中国移动通讯国际识别码 具体它是指的什么意思
正确的叫法是“国际移动用户识别”简称IMSI 。其共15位数字组成。其结构为:MCC(移动台国家码3位、我国为460)MNC(移动台网络号1或2位 、00表示移动、01表示联通)H1H2H3H4(用来表示用户在其PLMN中的HLR地址4位)MSIN(移动用户识别码10-11位)按照IMSI是查不出在哪产的。其中还可以查询国际移动台设备识别码(IMEI)可以等到颁发机构和手机软件版本 。第一部分TAC,TypeAllocationCode ,类型分配码,由8位数字组成(早期是6位),是区分手机品牌和型号的编码 ,该代码由GSMA及其授权机构分配 。其中TAC码前两位又是分配机构标识(ReportingBodyIdentifier),是授权IMEI码分配机构的代码,如01为美国CTIA ,35为英国BABT,86为中国TAF。第二部分FAC,FinalAssemblyCode ,最终装配地代码,由2位数字构成,仅在早期TAC码为6位的手机中存在 ,所以TAC和FAC码合计一共8位数字。FAC码用于生产商内部区分生产地代码 。第三部分SNR ,SerialNumber,序列号,由第9位开始的6位数字组成 ,区分每部手机的生产序列号。第四部分CD,CheckDigit,验证码 ,由前14位数字通过Luhn算法计算得出。第五部分SVN,SoftwareVersionNumber,软件版本号 ,区分同型号手机出厂时使用的不同软件版本,仅在部分品牌的部分机型中存在 。一般来说,由IMEI码中的TAC部分就可以得出手机的型号 ,但也有个别品牌不同型号的手机共用一个TAC码。同时,由于一个TAC最多只能对应6位数字序列号就是我们手机按下*#06#看到的一串15-17位的数字。该设备授权IMEI码分配机构为英国 。而要查厂家看下SN。山寨机子就不对了,他们的imei是随便刷进去的 ,好多机子都一样。