设为首页 加入收藏

TOP

使用Python PIL库实现简单验证码的去噪处理(一)
2019-05-23 14:42:48 】 浏览:193
Tags:使用 Python PIL 实现 简单 验证 处理

首先看一下未经处理的验证码图片:


使用Python PIL库实现简单验证码的去噪处理 


对图片处理主要使用了PIL库的Image类。


首先使用Image的open方法打开上面的图片,可以得到一个PIL.Image.Image对象,之后就可以调用convert、filter、point和putpixel等方法来处理图片。


我们可以通过convert方法将上面的彩色图片转换成灰度图:


使用Python PIL库实现简单验证码的去噪处理


运行结果:


使用Python PIL库实现简单验证码的去噪处理


通过保存的图片可以看出来,已经由原来的彩图变成了灰度图,或者也可以认为是黑白图。什么叫灰度图?我们知道彩色图片是由不同的颜色的像素组合到一起的,那灰度图可以类似的认为是由不同灰度值的像素组合在一起后呈现出来的。任何颜色都有红、绿、蓝三原色组成,假如原来某点的颜色为RGB(R,G,B),那么,我们可以通过下面几种方法,将其转换为灰度:
1.浮点算法:Gray=R*0.3+G*0.59+B*0.11
2.整数方法:Gray=(R*30+G*59+B*11)/100
3.移位方法:Gray =(R*76+G*151+B*28)>>8;
4.平均值法:Gray=(R+G+B)/3;
5.仅取绿色:Gray=G;


通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。


用代码实现看一下:


?运行结果:
image mode:  RGB
(234, 235, 236)
----------------------------------------
imgry mode:  L
234
[Finished in 0.1s]


使用Python PIL库实现简单验证码的去噪处理


代码说明:


通过image.mode方法可以获得当前的PIL.Image.Image对象(也就是当前打开的图片)的mode值,而mode值表示图片的单位颜色是由RGB三个值组成的还是由灰度值组成的;


而getpixel可以获取某个像素的RGB值或者灰度值。我们知道图片是由许多像素组成的,每个像素在图片上都有一个对应的坐标x和y,而“(0, 0)”就表示该图片左上角顶点的像素。


由上面的结果我们可以知道,在将图片转换成灰度图之前,“(0, 0)”代表的像素的颜色是由RGB组成的:(21, 10, 26);在通过concert将彩色图片转换成灰度后,“(0, 0)”代表的像素的颜色值就变成了一个值:“15”,通过打印imgry.mode我们也可以知道,此时图片已经变成了灰度图,它的每一个像素的颜色都变成了一个灰度值。


其实这时候我们也可以简单的计算一下,使用前面说的浮点算法将上面的(21, 10, 26)三个值带入计算:
>>> 21*0.3+10*0.59+26*0.11
15.059999999999999


结果显示确实由浮点算法将RGB值变成了灰度值。


我们已经得到了灰度图,接下来就是将灰度图二值化。所谓二值化就是将灰度图像转换成由黑白二色组成的图像。思路就是确定一个阈值,大于阈值的像素表示为白色,小于阈值的像素表示为黑色,以此将图片的像素(灰度值)划分为两部分:0和1,例如0代表黑色,1代表白色,然后我们就可以用一串0和1组成的数字来表示一张图片。


将灰度图二值化会用到point方法,它可以接收一个灰度转二值的映射table,具体原理暂时还没弄明白,代码实现过程是这样的:


使用Python PIL库实现简单验证码的去噪处理


运行结果:


使用Python PIL库实现简单验证码的去噪处理


通过结果不难看出,我们已经将最开始的彩色图由灰度图转变成了仅由黑白二色组成的图片,实现了二值化。这里需要说明的是,threshold参数值针对当前的验证码图片合适,该值需要根据验证码类型不同进行调试来确定。


然后我们再看看(0, 0)坐标代表的像素的颜色值是什么:


运行结果:


image mode:  RGB
(234, 235, 236)
None
----------------------------------------
imgry mode:  L
234
[(1, 16), (1, 17), (3, 18), (3, 20), (3, 21), (2, 22), (3, 24), (2, 25), (1, 26), (3, 28), (1, 29), (6, 31), (15, 32), (136, 33), (193, 34), (115, 35), (52, 36), (25, 37), (24, 38), (16, 39), (7, 40), (4, 41), (3, 42), (4, 43), (2, 44), (4, 45), (4, 46), (2, 48), (4, 49), (2, 50), (4, 51), (4, 52), (2, 53), (11, 54), (18, 55), (21, 56), (71, 57), (61, 58), (24, 59), (15, 60), (17, 61), (11, 62), (8, 63), (11, 64), (8, 65), (10, 66), (6, 67), (4, 68), (5, 69), (9, 70), (7, 71), (11, 72), (11, 73), (6, 74), (16, 75), (22, 76), (15, 77), (19, 78), (12, 79), (16, 80), (11, 81), (17, 82), (24, 83), (29, 84), (18, 85), (35, 86), (18, 87), (22, 88), (23, 89), (25, 90), (19, 91), (21, 92), (19, 93), (29, 94), (25, 95), (20, 96), (17, 97), (15, 98), (16, 99), (24, 100), (21, 101), (14, 102), (23, 103), (20, 104), (15, 105), (15, 106), (12, 107), (16, 108), (19, 109), (18, 110), (10, 111), (15, 112), (16, 113), (31, 114), (16, 115), (21, 116), (15, 117), (15, 118), (19, 119), (15, 120), (14, 121), (23, 122), (17, 123), (17, 124), (17, 125), (10, 126), (19, 127), (18, 128), (10, 129), (11, 130), (9, 131), (13, 132), (21, 133), (12, 134), (18, 135), (15, 136), (9, 137), (20, 138), (20, 139), (15, 140), (21, 141), (30, 142), (30, 143), (35, 144), (35, 145), (122, 146), (43, 147), (36, 148), (32, 149), (21, 150), (37, 151), (30, 152), (45, 153), (33, 154), (31, 155), (37, 156), (37, 157), (37, 158), (33, 159), (51, 160), (64, 161), (47, 162), (32, 163), (39, 164), (48, 165), (51, 166), (55, 167), (126, 168), (64, 169), (217, 170), (263, 171), (85, 172), (44, 173), (39, 174), (44, 175), (38, 176), (60, 177), (43, 178), (54, 179), (47, 180), (64, 181), (55, 182), (56, 183), (44, 184), (66, 1

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Python对列表中的元素进行批量修改 下一篇Python中对arrow库的总结

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目