博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python简单识别验证码去噪
阅读量:5035 次
发布时间:2019-06-12

本文共 2932 字,大约阅读时间需要 9 分钟。

 

验证码多种多样,我这里提供的方法仅对有噪点的验证码进行识别有效。

 

首先,这是我准备的原始图片 4.png

 

具体的实现代码

import tesserocrfrom PIL import Image, ImageDrawimport time# image = Image.open("img/4_1.png")# fh = open("img/1.txt", "w")# w, h = image.size# 图片转文本,测试用# for i in range(h):#     for j in range(w):#         cl = image.getpixel((j, i))#         clall = cl[0] + cl[1] + cl[2]#         # clall == 0即当前像素为黑色#         if clall == 0:#             fh.write("0")#         else:#             fh.write("1")#     fh.write("\n")# fh.close()# 将图片转为黑白二色def black_white(image):    w, h = image.size    for i in range(h):        for j in range(w):            cl = image.getpixel((j, i))            clall = cl[0] + cl[1] + cl[2]            # clall == 0即当前像素为黑色            if clall >= 155*3:  # 根据具体的图片修改                image.putpixel((j, i), (255, 255, 255))            else:                image.putpixel((j, i), (0, 0, 0))#二值数组t2val = {}def twoValue(image,G):    for y in range(0,image.size[1]):        for x in range(0,image.size[0]):            g = image.getpixel((x,y))            if g > G:                t2val[(x,y)] = 1            else:                t2val[(x,y)] = 0# 降噪# 根据一个点A的RGB值,与周围的8个点的RBG值比较,设定一个值N(0 
<8),当A的RGB值与周围8个点的RGB相等数小于N时,此点为噪点# G: Integer 图像二值化阀值 N: Integer 降噪率 0
<8 Z: Integer 降噪次数def clearNoise(image,N,Z): for i in range(0,Z): t2val[(0,0)] = 1 t2val[(image.size[0] - 1,image.size[1] - 1)] = 1 for x in range(1,image.size[0] - 1): for y in range(1,image.size[1] - 1): nearDots = 0 L = t2val[(x,y)] if L == t2val[(x - 1,y - 1)]: nearDots += 1 if L == t2val[(x - 1,y)]: nearDots += 1 if L == t2val[(x- 1,y + 1)]: nearDots += 1 if L == t2val[(x,y - 1)]: nearDots += 1 if L == t2val[(x,y + 1)]: nearDots += 1 if L == t2val[(x + 1,y - 1)]: nearDots += 1 if L == t2val[(x + 1,y)]: nearDots += 1 if L == t2val[(x + 1,y + 1)]: nearDots += 1 if nearDots < N: t2val[(x,y)] = 1def saveImage(filename,size): image = Image.new("1",size) draw = ImageDraw.Draw(image) for x in range(0,size[0]): for y in range(0,size[1]): draw.point((x,y),t2val[(x,y)]) image.save(filename)def start(img_path,save_img_path): image = Image.open(img_path) black_white(image) image = image.convert("L") twoValue(image,100) clearNoise(image,4,1) saveImage(save_img_path,image.size) print(tesserocr.file_to_text(save_img_path))img_path = "img/4.png"save_img_path = "img/4_1.png"start(img_path, save_img_path)

 

 

 经过处理后得到以下图片 4_1.png

 

 

 

控制台输出结果

ziri

 

不过以上是在理想情况下的实现,对于某些图片的识别率不高

 

等后期加上一些算法提高识别率把。

 

 

 

 

转载于:https://www.cnblogs.com/YLTzxzy/p/11331128.html

你可能感兴趣的文章
[Java]类的生命周期(下)类的初始化[转]
查看>>
第8讲++数据表和约束的创建(实训)
查看>>
学习《Numpy快速教程
查看>>
tomcat下部署应用helloworld
查看>>
Microsoft.ReportViewer winform web 部署问题
查看>>
Html总结
查看>>
Winform远程更新代码
查看>>
SpagoBI 论坛
查看>>
Linux Notes
查看>>
支付那些小事
查看>>
int to string & string to int
查看>>
combobox的那几个change事件
查看>>
java.util中,util是什么意思
查看>>
[译]Professional ASP.NET MVC3(01)-Chapter 1:Getting Started(上)
查看>>
windows硬盘读写测试命令及运行结果
查看>>
[NOIP提高组]金明的预算方案
查看>>
LeetCode 881.救生艇(C++)
查看>>
dedecms织梦判断当前页面是首页、栏目页还是文章页
查看>>
Java压缩技术(二) ZIP压缩——Java原生实现
查看>>
团队项目之需求规格说明书
查看>>