Tesseract识别数字1为t求助:截图邮件提取异常
截图邮件地址OCR提取问题
我尝试从截图中提取邮件地址,使用的代码如下:
image = cv2.imread('image_name.jpg') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1] thresh = 255 - thresh text = pytesseract.image_to_string(thresh, config = '--psm 6')
我已经试过灰度化、阈值处理、反转等多种预处理方式,但问题仍未解决:之前数字5被识别为's'、数字1被识别为'i',用上述代码预处理后5的识别问题解决了,但现在数字1被识别为't'。
另外,我在Anaconda的Jupyter Notebook中运行cv2.imshow()时出现报错:
The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'
无法直接查看预处理后的图片,处理后的图片为黑白高对比度效果,文字为白色、背景为黑色。
解决建议
1. 针对数字1的识别优化
- 限定识别字符范围,添加白名单只保留邮件地址常用字符,减少误判:
text = pytesseract.image_to_string(thresh, config='--psm 6 -c tessedit_char_whitelist=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@.') - 调整
--psm参数,因为邮件地址是单行文本,尝试用--psm 7(将图像视为单行):text = pytesseract.image_to_string(thresh, config='--psm 7 -c tessedit_char_whitelist=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@.')
2. 优化预处理步骤
- 添加形态学操作去除小噪点,细化文字边缘:
import cv2 import numpy as np image = cv2.imread('image_name.jpg') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1] thresh = 255 - thresh # 形态学开运算,消除小干扰点 kernel = np.ones((1,1), np.uint8) thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel) text = pytesseract.image_to_string(thresh, config='--psm 6 -c tessedit_char_whitelist=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@.')
3. 解决cv2.imshow报错问题
- 在Jupyter Notebook中用
matplotlib替代显示图片:import matplotlib.pyplot as plt # 显示预处理后的灰度图 plt.imshow(thresh, cmap='gray') plt.axis('off') # 隐藏坐标轴 plt.show() - 也可以重新安装带GUI支持的OpenCV:
conda install -c conda-forge opencv
内容的提问来源于stack exchange,提问作者ajaygarg
相关产品推荐
相关产品推荐

