说到验证码识别,肯定会提到 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 识别即可
处理之后