原代码如下:

image = image.convert('L') 
    threshold =  80
    table = []
    for i in range(256) :
        if i < threshold :
            table.append(0)
        else :
            table.append(1)
image = image.point(table,'1')

比较令人疑惑的地方就是最后一行代码了,给个列表莫名其妙的就将图片二值化处理了,那些干扰线怎么去掉的我也没整明白。让我们用这个代码跑一下验证码试试。

原始图片:

python 消除强光干扰 python去干扰线_image.point()二值化处理详解

用image.convert('L')灰度处理的图片:

python 消除强光干扰 python去干扰线_python 消除强光干扰_02

二值化后的的图片:

python 消除强光干扰 python去干扰线_验证码去除干扰线_03

可以看到干扰线已经去除,但是为啥给了n(阈值)个0,(256-n)个1的列表后干扰线就去除了?

百度“去除干扰线的方法”有一些说的是对比周围n个像素点,小于阈值就去掉(就这张图看干扰线确实比较细一些),然后我一直往这个方向去想还是想不通。后来各种百度后才发现这个代码用的并不是这个方法。

 

首先我们要了解一下图片基本是由RGB三原色组成的,类似于三维坐标,每个可以取值0~255,三个组合起来也就是代表着每个像素点有255*255*255种取值。然后灰度处理是将这个三维的值转换为一维的灰度值(0~255),使图像处理时计算量变小。(我之前想不通还有很大的原因是我以为灰度处理是将图片转换成只有三个值(黑、白、灰)

接着设置阈值的作用是将灰度值小于阈值的变为白,大于的变为黑。

image.point(table,'1')应该是这样参照转换:table[n] = x ,其中n是灰度值,x是转换为什么值。这样每个灰度值就有对应的值,这就是二值化处理。贴一下代码和结果这个代码不能去除干扰线的验证码你们就能更好的理解了

image = Image.open('aa.jpg')
    image.show()
    #将图片转化成256个级别的灰度,颜色越深灰度越高
    image = image.convert('L')
    image.show()
    #设置阈值,如果灰度小于阈值变为白色(黑色),否则变为黑色(白色)
    threshold =  80
    table = []
    for i in range(256) :
        if i < threshold :
            table.append(0)
        else :
            table.append(1)
    #参照这个表进行二值化
    image = image.point(table,'1')
    image.show()

原图:

python 消除强光干扰 python去干扰线_python_04

灰度处理:

python 消除强光干扰 python去干扰线_python 消除强光干扰_05

二值化处理后:

python 消除强光干扰 python去干扰线_验证码去除干扰线_06

可以看到颜色较淡的V被去掉了,干扰线没有被去掉

所以这个代码并不能去除那些验证码和干扰线灰度值交错不一的干扰线