如何用OpenCV Python提取模糊点状浮雕序列号?
优化点状浮雕序列号的OCR提取方案
针对点状浮雕这类低辨识度的序列号,原方案的边缘检测+过度膨胀会破坏字符的点状结构,导致EasyOCR无法准确识别。以下是针对性的优化方案:
核心调整思路
- 放弃边缘检测,改用自适应阈值保留点状字符的完整轮廓
- 使用贴合点状结构的形态学核,避免过度膨胀导致字符粘连
- 限制OCR识别的字符集,减少干扰匹配
修改后的完整代码
import numpy as np import cv2 from easyocr import Reader from typing import List reader = Reader(["en"], model_storage_directory="./model") def process(image: bytes) -> List[str]: buff = np.frombuffer(image, np.uint8) # 读取彩色图后转灰度 img = cv2.imdecode(buff, cv2.IMREAD_COLOR) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 自适应阈值处理:更适合光照不均的点状字符,保留细节 thresh = cv2.adaptiveThreshold( gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2 ) # 使用十字形核做膨胀:贴合点状字符的连接结构,避免方形核过度模糊轮廓 kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3)) dilated = cv2.dilate(thresh, kernel, iterations=2) # 限制OCR识别字符集为数字+大写字母,过滤无关结果 result = reader.readtext( dilated, allowlist='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', paragraph=False, detail=0 ) # 合并结果(如果识别为多个片段) return [' '.join(result).replace(' ', '')] if result else []
关键改动说明
- 自适应阈值:替代Canny边缘检测,能在局部区域内自动调整阈值,更好保留点状字符的灰度差异,避免边缘丢失。
- 十字形膨胀核:相比方形核,十字形更贴合点状字符的笔画延伸方向,膨胀后不会过度模糊字符的边界,减少字符粘连。
- 字符集限制:通过
allowlist指定仅识别数字和大写字母,排除EasyOCR可能误识别的特殊符号或小写字母,提升匹配精度。 - 结果合并:如果OCR将序列号拆分为多个片段,自动合并为完整字符串,减少后续处理成本。
额外建议
如果仍有识别误差,可以尝试:
- 对输入图像先做高斯模糊(
cv2.GaussianBlur(gray, (3,3), 0)),减少背景噪点干扰 - 调整自适应阈值的
blockSize(奇数,如13、15)和C值(如3、4),适配不同的浮雕深浅 - 尝试EasyOCR的
adjust_contrast=True参数,增强图像对比度
内容的提问来源于stack exchange,提问作者Ikhwanul Labib
相关产品推荐
相关产品推荐

