2022年 11月 5日

Python 代码实现验证码识别

今天咋们继续利用pillow和pytesseract来实现验证码的识别

一、环境配置

  • 需要 pillow 和 pytesseract 这两个库,pip install 安装就好了。

  1. pip install pillow -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
  2. pip install pytesseract -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
  • 安装好Tesseract-OCR.exe

  • pytesseract 库的配置:搜索找到pytesseract.py,打开该.py文件,找到 tesseract_cmd,改变它的值为刚才安装 tesseract.exe 的路径。

图片

二、验证码识别

识别验证码,需要先对图像进行预处理,去除会影响识别准确度的线条或噪点,提高识别准确度。

实例1

  1. import cv2 as cv
  2. import pytesseract
  3. from PIL import Image
  4. def recognize_text(image):
  5.     # 边缘保留滤波  去噪
  6.     dst = cv.pyrMeanShiftFiltering(image, sp=10, sr=150)
  7.     # 灰度图像
  8.     gray = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)
  9.     # 二值化
  10.     ret, binary = cv.threshold(gray, 0255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
  11.     # 形态学操作   腐蚀  膨胀
  12.     erode = cv.erode(binary, None, iterations=2)
  13.     dilate = cv.dilate(erode, None, iterations=1)
  14.     cv.imshow('dilate', dilate)
  15.     # 逻辑运算  让背景为白色  字体为黑  便于识别
  16.     cv.bitwise_not(dilate, dilate)
  17.     cv.imshow('binary-image', dilate)
  18.     # 识别
  19.     test_message = Image.fromarray(dilate)
  20.     text = pytesseract.image_to_string(test_message)
  21.     print(f'识别结果:{text}')
  22. src = cv.imread(r'./test/044.png')
  23. cv.imshow('input image', src)
  24. recognize_text(src)
  25. cv.waitKey(0)
  26. cv.destroyAllWindows()

运行效果如下:

  1. 识别结果:3n3D
  2. Process finished with exit code 0

图片

实例2

  1. import cv2 as cv
  2. import pytesseract
  3. from PIL import Image
  4. def recognize_text(image):
  5.     # 边缘保留滤波  去噪
  6.     blur =cv.pyrMeanShiftFiltering(image, sp=8, sr=60)
  7.     cv.imshow('dst', blur)
  8.     # 灰度图像
  9.     gray = cv.cvtColor(blur, cv.COLOR_BGR2GRAY)
  10.     # 二值化
  11.     ret, binary = cv.threshold(gray, 0255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
  12.     print(f'二值化自适应阈值:{ret}')
  13.     cv.imshow('binary', binary)
  14.     # 形态学操作  获取结构元素  开操作
  15.     kernel = cv.getStructuringElement(cv.MORPH_RECT, (32))
  16.     bin1 = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel)
  17.     cv.imshow('bin1', bin1)
  18.     kernel = cv.getStructuringElement(cv.MORPH_OPEN, (23))
  19.     bin2 = cv.morphologyEx(bin1, cv.MORPH_OPEN, kernel)
  20.     cv.imshow('bin2', bin2)
  21.     # 逻辑运算  让背景为白色  字体为黑  便于识别
  22.     cv.bitwise_not(bin2, bin2)
  23.     cv.imshow('binary-image', bin2)
  24.     # 识别
  25.     test_message = Image.fromarray(bin2)
  26.     text = pytesseract.image_to_string(test_message)
  27.     print(f'识别结果:{text}')
  28. src = cv.imread(r'./test/045.png')
  29. cv.imshow('input image', src)
  30. recognize_text(src)
  31. cv.waitKey(0)
  32. cv.destroyAllWindows()

运行效果如下:

  1. 二值化自适应阈值:181.0
  2. 识别结果:8A62N1
  3. Process finished with exit code 0

图片

实例3

  1. import cv2 as cv
  2. import pytesseract
  3. from PIL import Image
  4. def recognize_text(image):
  5.     # 边缘保留滤波  去噪
  6.     blur = cv.pyrMeanShiftFiltering(image, sp=8, sr=60)
  7.     cv.imshow('dst', blur)
  8.     # 灰度图像
  9.     gray = cv.cvtColor(blur, cv.COLOR_BGR2GRAY)
  10.     # 二值化  设置阈值  自适应阈值的话 黄色的4会提取不出来
  11.     ret, binary = cv.threshold(gray, 185255, cv.THRESH_BINARY_INV)
  12.     print(f'二值化设置的阈值:{ret}')
  13.     cv.imshow('binary', binary)
  14.     # 逻辑运算  让背景为白色  字体为黑  便于识别
  15.     cv.bitwise_not(binary, binary)
  16.     cv.imshow('bg_image', binary)
  17.     # 识别
  18.     test_message = Image.fromarray(binary)
  19.     text = pytesseract.image_to_string(test_message)
  20.     print(f'识别结果:{text}')
  21. src = cv.imread(r'./test/045.jpg')
  22. cv.imshow('input image', src)
  23. recognize_text(src)
  24. cv.waitKey(0)
  25. cv.destroyAllWindows()

运行效果如下:

  1. 二值化设置的阈值:185.0
  2. 识别结果:7364
  3. Process finished with exit code 0

图片

结语

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对小编的支持。