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