化学结构式图像的预处理与Tesseract OCR识别优化求助
针对化学结构式图像的OCR预处理与优化方案
一、预处理优化步骤
化学结构式图像的核心干扰是结构式线条,且字符多为零散单/双字符,针对600x800像素的这类图像,可调整预处理流程:
- 自适应阈值替代固定阈值:解决局部明暗不均问题,避免字符因亮度差异丢失
- 针对性线条过滤:用形态学开运算清除结构式的细线条,保留字符轮廓
- 字符轮廓增强:轻微膨胀字符,确保边缘清晰,同时避免过度膨胀导致字符粘连
- 柔和噪声清除:用高斯模糊替代中值模糊,在清除背景噪声的同时不破坏字符细节
二、Tesseract配置调整
当前使用的--psm 10仅适配单字符识别,无法处理双字符(如"Na""CO"),需调整配置:
- 混合单/双字符场景用
--psm 6(默认文本块识别),让Tesseract自动识别连续字符 - 添加字符白名单,限制识别范围减少错误:
-c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789() - 切换至LSTM模式
--oem 1,对印刷体字符的识别精度优于传统模式
三、修改后的代码实现
import cv2 import pytesseract import numpy as np img_path = "D:\\User\\Intel_AI2\\Project\\Data\\Test\\nahco3.png" img_cv = cv2.imread(img_path) gray_img = cv2.cvtColor(img_cv, cv2.COLOR_BGR2GRAY) # 1. 自适应阈值处理,适配局部明暗差异 inverted = cv2.bitwise_not(gray_img) adaptive_thresh = cv2.adaptiveThreshold(inverted, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) # 2. 过滤结构式线条干扰 line_kernel = np.ones((1, 3), np.uint8) filtered = cv2.morphologyEx(adaptive_thresh, cv2.MORPH_OPEN, line_kernel, iterations=1) # 3. 膨胀增强字符轮廓 char_kernel = np.ones((2, 2), np.uint8) dilated = cv2.dilate(filtered, char_kernel, iterations=1) # 4. 高斯模糊清除噪声 blurred = cv2.GaussianBlur(dilated, (3, 3), 0) # 优化后的Tesseract配置 custom_config = r'--oem 1 --psm 6 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789()' print(pytesseract.image_to_string(blurred, lang='eng', config=custom_config)) cv2.imshow("Processed", blurred) cv2.waitKey(0) cv2.destroyAllWindows()
四、额外建议
若Tesseract仍达不到预期,可尝试:
- 针对化学特殊字符(如下标、括号)训练Tesseract自定义字符集
- 替换为
EasyOCR,该库对印刷体字符的鲁棒性更强,无需复杂预处理即可输出较好结果
内容的提问来源于stack exchange,提问作者Armanium
相关产品推荐
相关产品推荐

