You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过图像变换实现浮雕文字的准确OCR识别?

问题:浮雕文字制造零件的OCR识别难题

我一直在尝试对带有浮雕文字的制造零件图像进行OCR识别,示例图像如下:
image1
image2

零件表面粗糙,阈值分割等常规图像处理技术无法清晰区分背景与文字,导致pytesseract无法给出正确识别结果。

以下是我已尝试的技术代码:

image= cv2.imread('image.jpg')
darker= cv2.equalizeHist(image)
darker=darker[180:350, 200:450]
cv2_imshow(darker)
thresh = cv2.threshold(darker, 0, 255,
    cv2.THRESH_BINARY| cv2.THRESH_OTSU)[1]

cv2_imshow(thresh)
# adaptiveThresh = cv2.adaptiveThreshold(darker, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 35, 30)
# inverted_bin=cv2.bitwise_not(adaptiveThresh)
# cv2_imshow(inverted_bin)

kernel = np.ones((3,3),np.uint8)
processed_img = cv2.erode(thresh, kernel, iterations = 1)
processed_img = cv2.dilate(processed_img, kernel, iterations = 1)
cv2_imshow(processed_img)

img_roi = image[75:150, 75:150]
gray_img = cv2.cvtColor(img_roi, cv2.COLOR_BGR2GRAY)
cv2_imshow(gray_img)
gray_img.shape

# Gaussian Blur
Gaussian = cv2.GaussianBlur(gray_img, (5, 5), 0)
cv2_imshow(Gaussian)

# Median Blur
median = cv2.medianBlur(gray_img, 5)
cv2_imshow(median)

# # Bilateral Blur
bilateral = cv2.bilateralFilter(gray_img, 9, 75, 75)
cv2_imshow(bilateral)

text = pytesseract.image_to_string(cropped_img, lang='eng', config='--psm 7.5')
print("result: ", text)

我使用Pytesseract进行识别,已尝试OpenCV中的阈值分割(Binary_INV与OTSU阈值法)、高斯模糊、中值模糊、直方图均衡化、腐蚀、膨胀及Canny边缘检测,但这些方法均无法将图像文字增强到让pytesseract准确识别的程度。其中,经equalizeHist+OTSU阈值处理后的图像识别结果为:

result: KGdED

恳请各位提供可解决此问题的图像变换/处理方法,谢谢。


解决方案建议

针对粗糙表面浮雕文字的OCR增强,推荐以下几种针对性的图像处理方案:

1. 局部对比度增强(CLAHE)

全局直方图均衡化容易过度放大噪声,改用限制对比度自适应直方图均衡化(CLAHE),能在保留局部细节的同时抑制噪声:

import cv2
import numpy as np

image = cv2.imread('image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 初始化CLAHE,限制对比度阈值为2.0,网格大小8x8
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
enhanced_gray = clahe.apply(gray)

2. 基于梯度的文字提取

浮雕文字的边缘与背景存在梯度差异,可通过Sobel算子提取梯度,再进行阈值处理:

# 计算x方向梯度
sobel_x = cv2.Sobel(enhanced_gray, cv2.CV_64F, 1, 0, ksize=3)
# 转换为8位无符号整数
sobel_x = np.uint8(np.absolute(sobel_x))
# 自适应阈值分割
thresh = cv2.adaptiveThreshold(sobel_x, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
                               cv2.THRESH_BINARY_INV, 11, 2)

3. 形态学顶帽变换

顶帽变换能突出比周围亮的区域(浮雕文字如果是凸起且反光更强的话),适合粗糙背景的前景提取:

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
tophat = cv2.morphologyEx(enhanced_gray, cv2.MORPH_TOPHAT, kernel)
# 对顶帽结果进行二值化
_, binary_tophat = cv2.threshold(tophat, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

4. Tesseract参数优化

除了图像处理,调整Tesseract的配置参数也能提升识别率:

  • 使用--psm 6(假设文字是一个单一的文本块)替代7.5;
  • 增加--oem 3(使用默认OCR引擎模式);
  • 针对字符集添加-c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,过滤无关字符。

示例调用:

text = pytesseract.image_to_string(thresh, lang='eng', 
                                   config='--psm 6 --oem 3 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')

5. 尝试预训练的文字检测模型

如果上述方法效果仍不理想,可以结合EAST、YOLO等文字检测模型先定位文字区域,再裁剪后进行识别,减少背景干扰。

内容的提问来源于stack exchange,提问作者nv001

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 15:52:49