模糊图像字符提取求助:Tesseract与自适应阈值处理结果不全问题
嘿,咱们来搞定你这个OCR识别的问题!我发现你的代码里有个关键小疏漏,再加上几个预处理的优化技巧,就能大幅提升识别准确率,尤其是图像右侧的信息。
先说说你原代码里的核心问题
你明明生成了自适应阈值处理后的thresh图像,但最后调用pytesseract.image_to_string()的时候,传入的却是原始的img——等于白做了预处理!这是最影响结果的问题。
改进后的完整代码
我调整了预处理流程,还优化了Tesseract的识别配置,你可以直接用:
import pytesseract import cv2 import numpy as np # 如果你本地的Tesseract没有自动配置路径,需要加上这行(根据你的安装路径调整) # pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' # 读取图像并放大:小字符放大后更易被识别 img = cv2.imread('M.jpeg') img = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC) # 按比例放大2倍,避免拉伸变形 # 转灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 高斯模糊降噪:模糊图像通常有噪点,先清掉干扰 blurred = cv2.GaussianBlur(gray, (5, 5), 0) # 自适应阈值处理:改用高斯加权均值,反转阈值让字符白、背景黑(更符合Tesseract偏好) thresh = cv2.adaptiveThreshold( blurred, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, # 高斯加权比普通均值更适配局部亮度不均的图像 cv2.THRESH_BINARY_INV, # 反转阈值,字符为白,背景为黑 11, # 块大小(必须是奇数,可根据图像微调) 6 # 常数(调整阈值的偏移量,可微调) ) # 形态学膨胀:填补字符的小缺口,让轮廓更连贯 kernel = np.ones((2, 2), np.uint8) thresh = cv2.dilate(thresh, kernel, iterations=1) # 显示处理后的图像,方便你调试参数 cv2.imshow('Processed Image', thresh) cv2.waitKey(0) cv2.destroyAllWindows() # 用处理后的阈值图+自定义配置识别 custom_config = r'--oem 3 --psm 6' # OEM3用默认引擎,PSM6告诉Tesseract这是单一文本块 text = pytesseract.image_to_string(thresh, config=custom_config) print("识别结果:") print(text)
关键优化点说明
- 用处理后的图像识别:这次终于把
thresh传给image_to_string了,预处理的效果才能发挥出来 - 图像放大:按比例放大模糊图像里的小字符,让Tesseract更容易捕捉到字符细节
- 高斯降噪:减少模糊图像的噪点干扰,避免OCR把噪点当成字符
- 高斯自适应阈值:比普通均值阈值更能应对局部亮度不均的情况,适合模糊图像
- 反转阈值:Tesseract默认对“白字符黑背景”的识别效果更好,反转后贴合它的偏好
- 形态学膨胀:填补字符边缘的小缺口,让字符轮廓更完整连贯
- Tesseract配置:
--psm 6告诉引擎输入是一个单一的文本块,避免它错误拆分识别区域
如果还是有小问题,可以试试这些微调
- 调整自适应阈值的块大小(比如改成13、15)和常数(比如5、7),适配你的具体图像
- 试试形态学腐蚀操作(把
dilate换成erode),如果字符边缘有多余噪点的话 - 如果是特定语言的文本,加上
lang参数,比如lang='eng'或对应语言代码
内容的提问来源于stack exchange,提问作者Praveen Pattar
相关产品推荐
相关产品推荐

