字符型图片验证码识别完整过程及Python实现的博主,我的大部分知识点都是从他那里学来的。
想要识别验证码,收集足够多的样本后,首先要做的就是对验证码原始图片进行处理,对验证码识别分类之前,一般包括:将彩色图片转换成灰度图,将灰度图二值化和去除噪点三个基本过程。这里仅以比较简单的验证码为例,介绍一下如何通过python的公益诉讼库对图片去噪。
首先看一下未经处理的验证码图片:
#=utf8编码 从公益诉讼导入图像 def main (): 形象=Image.open (“RandomPicture.png”) imgry=image.convert (L) imgry.save (“gray.png”) if __name__==癬_main__”: main ()
运行结果:
#=utf8编码 从公益诉讼导入图像 def main (): 形象=Image.open (“RandomPicture.png”) 打印的图像模式:image.mode 打印图像。获取像素((0,0)) 打印”——“* 40 imgry=image.convert (L) 打印“imgry模式:”,imgry.mode 打印imgry。获取像素((0,0)) if __name__==癬_main__”: main ()
运行结果:
图像模式:RGB (21日,10日,26) ---------------------------------------- L imgry模式: 15
代码说明:
通过image.mode方法可以获得当前的PIL.Image.Image对象(也就是当前打开的图片)的模式值,而模式值表示图片的单位颜色是由RGB三个值组成的还是由灰度值组成的;
而获取像素可以获取某个像素的RGB值或者灰度值。我们知道图片是由许多像素组成的,每个像素在图片上都有一个对应的坐标x和y,而“(0,0)”就表示该图片左上角顶点的像素。
由上面的结果我们可以知道,在将图片转换成灰度图之前,“(0,0)“代表的像素的颜色是由RGB组成的:(26)21日10日;在通过音乐会将彩色图片转换成灰度后,“(0,0)“代表的像素的颜色值就变成了一个值:“15”,通过打印imgry.mode我们也可以知道,此时图片已经变成了灰度图,它的每一个像素的颜色都变成了一个灰度值。
其实这时候我们也可以简单的计算一下,使用前面说的浮点算法将上面的(26)21日10日三个值带入计算:
在在在21 * 0.3 + 10 * 0.59 + 26 * 0.11 15.059999999999999
结果显示确实由浮点算法将RGB值变成了灰度值。
我们已经得到了灰度图,接下来就是将灰度图二值化。所谓二值化就是将灰度图像转换成由黑白二色组成的图像。思路就是确定一个阈值,大于阈值的像素表示为白色,小于阈值的像素表示为黑色,以此将图片的像素(灰度值)划分为两部分:0和1,例如0代表黑色,1代表白色,然后我们就可以用一串0和1组成的数字来表示一张图片。