当前位置: 首页 > 后端技术 > Python

验证码识别之二值化

时间:2023-03-26 13:32:42 Python

前言二值化,顾名思义,就是把一个数变成两个值,一般不是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步重新计算。算法实现如下:importnumpyasnpfromPILimportImagedefiteration(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)#即初始阈值T0m=-1whilek!=m:#C1和C2是前景和背景像素C1=a[a>=k]C2=a[a=k]C2=a[a