Python Tesseract-orc 识别简单验证码
生活随笔
收集整理的这篇文章主要介绍了
Python Tesseract-orc 识别简单验证码
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
1 对图片进行二值化处理
二值化就是将图片的颜色转换成非黑即白的图片
from PIL import Imageim = Image.open('yzm.jpg') # 用pil打开这个图片 im = im.convert('L') # 将图像转换为“L”模式, 即黑白。 yuzhi = 127 # 根据需要自行更改阈值 im = im.point(lambda x: 0 if x < yuzhi else x >= yuzhi, '1') # 二值化 127为分割灰度的点(阀值) im.show() # 查看图片图片资源:
经过上述处理应该这样的生成图片:
如果显示的图片效果不理想,可以调整阀值来进行调整(但是依然会留有小黑点)
2 去除噪点
把图片中的黑点去掉
from PIL import ImageDraw, Imagedef getPixel(image, x, y):"""去除黑点:param image: 图片路径:param x: 像素点x轴坐标:param y: 像素点y轴坐标:return:"""L = image.getpixel((x, y)) # 获取当前像素点的像素if L == 0: # 判读此像素点是否为黑,因为如果是白的就没必要处理了nearDots = 0 # 初始化记录周围有没有黑像素数量的值# 判断周围像素点(白色 +1)for i in range(1, 4): # 根据点的大小自行选择周围像素点层数# try 防止越界try:if L - image.getpixel((x - i, y - i)):nearDots += 1except:passtry:if L - image.getpixel((x - i, y)):nearDots += 1except:passtry:if L - image.getpixel((x - i, y + i)):nearDots += 1except:passtry:if L - image.getpixel((x, y - i)):nearDots += 1except:passtry:if L - image.getpixel((x, y + i)):nearDots += 1except:passtry:if L - image.getpixel((x + i, y - i)):nearDots += 1except:passtry:if L - image.getpixel((x + i, y)):nearDots += 1except:passtry:if L - image.getpixel((x + i, y + i)):nearDots += 1except:pass# 根据需求自行调节if nearDots > 16: # 这里如果周围16个是白点那么就返回一个白点,实现去黑点的操作return 1 # 返回白点else:return 0 # 返回黑点else:return 1def clearNoise(image):"""清除噪点"""draw = ImageDraw.Draw(image)# 循环遍历每个像素点for x in range(0, image.size[0]):for y in range(0, image.size[1]):color = getPixel(image, x, y)draw.point((x, y), color)return imageif __name__ == '__main__':im = Image.open("./yzm_gai.png")im = clearNoise(im)im.show()经过上述处理应该这样的生成图片:
3 OCR识别
import pytesseractfrom PIL import Imageimage = Image.open('yzm_gai.png') # chi_sim 是中文识别包,equ 是数学公式包,eng 是英文包 code = pytesseract.image_to_string(image, lang="chi_sim") print(code)识别结果:
M8K2成功,完美!!!
虽然本次识别成功,并不代表每次都可以识别成功,对于较复杂的验证码识别成功率更低,那该怎么办呢???
当然是训练!!!(待续。。。)
完整代码:
import pytesseract from PIL import Image, ImageDrawdef img_to_L(img_path):"""将图片转化为非黑即白的图片:param img_path: 图片路径:return:"""im = Image.open(img_path) # 用pil打开这个图片im = im.convert('L')yuzhi = 127im = im.point(lambda x: 0 if x < yuzhi else x >= yuzhi, '1') # 二值化 100为分割灰度的点(阀值),二值化就是将图片的颜色转换成非黑即白的图片im.show()return imdef getPixel(image, x, y):"""去除黑点:param image: 图片路径:param x: 像素点x轴坐标:param y: 像素点y轴坐标:return:"""L = image.getpixel((x, y)) # 获取当前像素点的像素if L == 0: # 判读此像素点是否为黑,因为如果是白的就没必要处理了nearDots = 0 # 初始化记录周围有没有黑像素数量的值# 判断周围像素点(白色 +1)for i in range(1, 4):try:if L - image.getpixel((x - i, y - i)):nearDots += 1except:passtry:if L - image.getpixel((x - i, y)):nearDots += 1except:passtry:if L - image.getpixel((x - i, y + i)):nearDots += 1except:passtry:if L - image.getpixel((x, y - i)):nearDots += 1except:passtry:if L - image.getpixel((x, y + i)):nearDots += 1except:passtry:if L - image.getpixel((x + i, y - i)):nearDots += 1except:passtry:if L - image.getpixel((x + i, y)):nearDots += 1except:passtry:if L - image.getpixel((x + i, y + i)):nearDots += 1except:passif nearDots > 16: # 这里如果周围10个是白点那么就返回一个白点,实现去黑点的操作return 1 # 返回白点else:return 0 # 返回黑点else:return 1def clearNoise(image):"""清除噪点:param image: 图像路径:return: """draw = ImageDraw.Draw(image)# 循环遍历每个像素点for x in range(0, image.size[0]):for y in range(0, image.size[1]):color = getPixel(image, x, y)draw.point((x, y), color)return imagedef OCR(im):# chi_sim 是中文识别包,equ 是数学公式包,eng 是英文包code = pytesseract.image_to_string(im, lang='eng')return codeif __name__ == '__main__':# 图像路径im = "yzm.jpg"# # 将图片转化为非黑即白的图片im = img_to_L(im)# 将上一步处理完成的im对象传给clearNoise()函数im = clearNoise(im)im.show()# 进行OCR识别code = OCR(im)print(code)总结
以上是生活随笔为你收集整理的Python Tesseract-orc 识别简单验证码的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: Excel 2010同时打开2个或多个独
- 下一篇: 用python贴吧自动回帖_python