前言 二值化顾名思义就是将数变成两种值,一般非0即1。而在验证码处理中,如果直接使用灰度图,那么每个像素的值会在0-255,这样肯定会增加计算时间,而二值化后每个像素的值只是0和1。
在前面的简单验证码识别中,我的二值化代码是这样写的:a = (a > 180) * 255,至于这里为什么不乘1而乘255,因为我要显示图片看看效果。如果只是用于算法识别的话,乘1会更好。但是,这里的180也就是二值化的阈值是如何得到的,开始是通过一个一个试然后看效果哪个好就选哪个,因为我们一般只识别某个网站的验证码,这样只要测试几次得到结果后便可用于这个网站其他的验证码。
这样测试有点浪费时间,虽然是一次性的,但是你手动测出的验证码不一定是最合适的。所以我们需要算法去自动计算出验证码的阈值,算法有很多,这里我们使用迭代法和最大类间方差法,通过这两个算法计算出来的阈值基本差不多。
迭代法 求出图像中的最小灰度值和最大灰度值,分别记为gmin和gmax,则阈值初值t0=(gmin+gmax)/2; 根据阈值t0将图像分割成前景和背景两部分,求出两部分的平均灰度值m1和m2,平均灰度值=总灰度值/像素个数 求出新阈值t1=(m1+m2)/2 如果t0=t1,则结束,否则将t1的值赋予t0,从第2步重新计算。 算法实现如下:
import numpy as npfrom pil import imagedef iteration(img_path): img = image.open(img_path).convert('l') a = np.array(img) a = a.ravel() k = int((int(a.max()) + int(a.min()))/2) # 即初始阈值t0 m = -1 while k != m: # c1和c2为前景和背景的像素 c1 = a[a >= k] c2 = a[a = k] c2 = a[a < k] if not(len(c1) and len(c2)): l.append(0) continue m1 = np.sum(c1)/len(c1) m2 = np.sum(c2)/len(c2) p1 = len(c1)/len(a) p2 = len(c2)/len(a) x = p1 * p2 * (m1 - m2) * (m1 - m2) l.append(x) return l.index(max(l))
最后,我正在学习一些机器学习的算法,对于一些我需要记录的内容我都会分享到博客和微信公众号(python成长路),欢迎关注。平时的话一般分享一些爬虫或者python的内容。
加密货币交易所比特币中国BTCC,将扩张至韩国
三月相约福州工博会,把握商机,台湾高技邀您共襄盛会!
短刀L400电池破解PHEV需求痛点
中国科技产业缺乏关键核心技术的痛点,并且揭示了“缺芯少屏”的严峻产业格局
三星Exynos1080跑分出炉,年内将问世
验证码识别之二值化介绍
2018年Q4全球服务器收入增长17.8%
PCB板有铅喷锡与无铅喷锡的差别在哪里
铜基板和铝基板区别
为什么电动汽车实际充电时间比厂家数据要长
笔记本电脑常见接口有哪些?
动态测试实验
一元钱,用电脑为外设供电
西部数据携手铠侠推出第六代3D闪存技术
SycoTec高速精密加工主轴 助力工件高精密加工
肉类抗生素检测仪的产品性能介绍
怎样去设计一种基于FPGA的以太网数据传输硬件?
怎样用好电烙铁
E开箱: vivo NEX 3 5G来袭,瀑布屏是怎么样的?
风河发布NFV平台,加快高效虚拟CPE部署