简单验证码识别

说到验证码识别,肯定会提到 tesseract-ocr


这个玩意是google出的一款文字识别工具,

但是它有一个致命的弱点,就是不能受到任何干扰


所以这篇文章主要是介绍如何去除验证码干扰的一些思路


准备工作 


1、tesseract-ocr 安装方法 不就介绍了,很简单


2、语言 python 需要扩展PIL    安装也简单  easy_install PIL  即可


几个概念


1、灰度 就是把图片变成黑白的


代码如下


    data_stream = io.BytesIO(imageData) #imageData是图片的二进制数据,可以通过文件读取或者网络获取
    image = Image.open(data_stream) #得到图片句柄或者叫上下文啥都行,总之就是一个引用
    enhancer = ImageEnhance.Contrast(image) #增强图片用,
    im = enhancer.enhance(3)#增强图片,可以不需要
    #将图片转换成灰度图片
    image = image.convert("L")  #灰度话图片 


ok图片变成黑白的了

可以用

    image.show()

将图片显示出来


2、二值化

就是把不太黑的变成白的,把很黑的变成纯黑的,中间这个阀值需要根据具体的情况设置

代码如下

#二值化
def twoValue(image):
    draw = ImageDraw.Draw(image)
    
    for x in range(image.size[0]):
        for y in range(image.size[1]):
            L = image.getpixel((x,y))
            #print x,y,'=',L
            if L >= 125:
                draw.point((x,y),255)
            else:
                draw.point((x,y),0)


二值化是一个重要的策略,根据情况具体修改,有时候甚至要反着来,比如是白色的变成黑色,不是白色的全部变成白色


3、去噪点

就是把图片上的没用的点去掉,算法策略,某个点周围8个点都是白色,说明是噪点,去除之,代码如下
def clearNoise(image,G,N,Z):
    draw = ImageDraw.Draw(image)
    for i in range(Z):
        for x in range(image.size[0]):
            for y in range(image.size[1]):
                color = getPixel(image,x,y,G,N)
                if color != None:
                    draw.point((x,y),color)

4、去干扰线

一般线都是直线,所以策略一般是找一些点 循环的朝下找,策略很多

#寻找下一个点
def findNextPoint(image,i,j,linePointArray,actionList):
    findNext = False
    if len(linePointArray)>=2:
        sina = calXielv(linePointArray)
        xielvDis = 1
        resultPoint = None
        for f in actionList:
            p, q, move = f(image, i, j)
            if move:
                tmp = copy.copy(linePointArray)
                tmp.append((p,q))
                xielv = calXielv(tmp)
                dis = abs(xielv-sina)
                if dis < xielvDis:
                    resultPoint = (p,q)
                    xielvDis = dis

        if resultPoint !=None:
            findNext = True
            i = resultPoint[0]
            j = resultPoint[1]
            linePointArray.append(resultPoint)
    else:
        #初始的三个点
        for f in actionList:
            p, q, move = f(image, i, j)
            if move:
                i = p
                j = q
                linePointArray.append((i,j))
                findNext = True
                #如果找到了就跳出
                break

    return  findNext,i,j

代码比较复杂,只要看个思路就ok 还是需要自己实现一下


最后处理完成之后  调用 tesseract 识别即可




处理之后



猜你喜欢

转载自blog.csdn.net/qiushi888/article/details/51888346