针对扭曲西文图像的Tesseract OCR识别最优参数及预处理方案咨询
适配低质量屏幕类西语文本的Tesseract识别方案
一、核心预处理步骤
- 分辨率放大:这类图像普遍像素密度低,先将原图放大2~3倍,使用INTER_CUBIC插值算法,避免字符边缘破碎丢失特征
- 灰度化+对比度拉伸:转换为灰度图后,用自适应直方图均衡化(CLAHE)处理拉开字符与背景的对比度,推荐参数
clipLimit=2.0、tileGridSize=(8,8) - 自适应二值化:不要使用全局二值化,这类图像明暗分布不均,采用自适应高斯二值化可提取不同亮度区域的字符,推荐参数块大小11、常数偏移2
- 噪点去除:先用33高斯模糊平滑图像,再用22矩形内核做1次形态学开运算,清除背景细碎噪点
- 倾斜校正:如果图像存在倾斜,用霍夫变换检测倾斜角度并校正到水平,Tesseract对倾斜超过3度的字符识别率会下降40%以上
二、最优Tesseract参数配置
- 引擎参数
oem设为1,使用LSTM神经网络引擎,是当前对印刷/屏幕字符识别效果最好的引擎 - 页面分割模式
psm设为6,适配单块统一文本块的场景,如果你是处理整页混合内容可改为3,单独切分的字符识别可改为10 - 白名单限制:添加西语专用字符白名单,过滤无关识别干扰,参数为
-c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzÁÉÍÓÚáéíóúñÑ0123456789.,;:!¡?¿ ' - 额外要求:必须安装西语
spa的best训练集,替换默认的fast训练集,准确率可提升30%以上
三、完整可运行代码示例
import cv2 import numpy as np import pytesseract from PIL import Image def preprocess_image(image_path, scale=2.5): # 读取原始图像 img = cv2.imread(image_path) # 放大提升分辨率 height, width = img.shape[:2] img = cv2.resize(img, (int(width*scale), int(height*scale)), interpolation=cv2.INTER_CUBIC) # 转灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 增强对比度 clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) gray = clahe.apply(gray) # 自适应二值化 binary = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2) # 去除噪点 kernel = np.ones((2,2), np.uint8) binary = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel, iterations=1) # 转换为PIL格式供pytesseract调用 return Image.fromarray(binary) # 预处理后执行识别 processed_img = preprocess_image('image.jpg') # 自定义识别配置 custom_config = r'--oem 1 --psm 6 -c tessedit_char_whitelist="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzÁÉÍÓÚáéíóúñÑ0123456789.,;:!¡?¿ "' print(pytesseract.image_to_string(processed_img, lang='spa', config=custom_config))
四、补充优化提示
- 如果识别文本以大写字符为主,可在配置中添加
-c textord_force_make_prop_words=F进一步提升准确率 - 如果存在字符粘黏情况,可在预处理步骤增加1次形态学腐蚀操作,拆分粘黏的字符边缘
内容的提问来源于stack exchange,提问作者Julio Cesar Damas Sanchez
相关产品推荐
相关产品推荐

