Tesseract OCR法语字符识别异常及图像优化无效问题求助
解决Tesseract识别法语重音字符及字母I错误的方案
针对你遇到的法语重音字符(é、è、ê)和大小写字母I识别错误问题,可通过以下步骤优化:
1. 安装并启用法语语言包
Tesseract默认不包含法语训练数据,需手动配置:
- 下载
fra.traineddata文件,放入Tesseract安装目录下的tessdata文件夹(例:C:\Program Files\Tesseract-OCR\tessdata) - 调用
image_to_string时指定lang='fra',强制使用法语模型识别
2. 调整Tesseract识别配置
修改自定义参数适配法语文本:
- 保留
--oem 3(混合引擎模式),将PSM模式改为--psm 3(自动页面分割,更适配多段落扫描件) - 添加字符白名单,限定识别范围为法语常用字符,减少误识别:
custom_config = r'--oem 3 --psm 3 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzéèêàâôûùç0123456789.,;:!?\'"()[] '
3. 优化图像预处理流程
- 避免用JPEG保存中间图像:JPEG有损压缩会丢失字符细节,改用PNG格式(或直接跳过本地保存步骤)
- 替换二值化方式:用自适应阈值替代Otsu阈值,更适配光照不均的扫描件:
work_img = cv2.adaptiveThreshold(filtered_img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) - 简化无效预处理:当前(1,1)内核的膨胀+腐蚀操作作用有限,可根据图像质量调整内核大小或直接移除
4. 简化图像流转流程
无需将pdf2image生成的PIL图像存盘再读取,直接转为OpenCV格式,减少质量损失:
img_cv = cv2.cvtColor(np.array(img[page_number]), cv2.COLOR_RGB2BGR)
优化后的完整代码
import pytesseract from tkinter.filedialog import askopenfilename from pdf2image import convert_from_path import os import cv2 import numpy as np pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' filePath = askopenfilename() img = convert_from_path(filePath, poppler_path=r'C:\poppler-0.68.0_x86\poppler-0.68.0\bin') path, fileName = os.path.split(filePath) fileBaseName, fileExtension = os.path.splitext(fileName) txt = "" # 法语识别专属配置 custom_config = r'--oem 3 --psm 3 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzéèêàâôûùç0123456789.,;:!?\'"()[] ' for page_number in range(len(img)): # 直接转换PIL图像为OpenCV格式 img_cv = cv2.cvtColor(np.array(img[page_number]), cv2.COLOR_RGB2BGR) gray = cv2.cvtColor(img_cv, cv2.COLOR_BGR2GRAY) # 去噪+自适应阈值处理 filtered_img = cv2.bilateralFilter(gray, 5, 75, 75) work_img = cv2.adaptiveThreshold(filtered_img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) # 指定法语识别 page_txt = pytesseract.image_to_string(work_img, lang='fra', config=custom_config) txt += page_txt print(f"Page # {page_number} - {page_txt[:50]}...") # 保存识别结果 with open(f"{os.path.join(path, fileBaseName)}_ocr.txt", "w", encoding="utf-8") as f: f.write(txt)
内容的提问来源于stack exchange,提问作者Irianeth
相关产品推荐
相关产品推荐

