如何校正倾斜矩形图像以实现电路板标签文字的准确识别?
电路板标签图像校正与OCR优化方案
一、基于黑边框的矩形校正方法(可行且易实现)
你给标签添加黑边框的思路很实用,可以通过以下步骤完成校正:
- 提取边框轮廓:用OpenCV的
cv2.findContours定位分割后图像中黑边框的最大轮廓(默认标签边框是图像中最突出的矩形)。 - 计算旋转角度:通过
cv2.minAreaRect获取轮廓的最小外接矩形,返回值包含旋转角度。注意OpenCV的角度范围是-90到0,需要转换:若角度小于-45度,旋转角度设为90 + angle;否则直接用-angle。 - 执行图像旋转:用
cv2.getRotationMatrix2D生成旋转矩阵,再通过cv2.warpAffine完成旋转,选择合适的边界填充方式避免内容裁剪。
示例代码片段:
import cv2 import numpy as np # 读取带黑边框的分割图像 img = cv2.imread('label_segmented.jpg', cv2.IMREAD_GRAYSCALE) # 二值化处理,让黑边框转为白色便于轮廓识别 _, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV) # 提取外部轮廓 contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 取面积最大的轮廓(对应标签边框) cnt = max(contours, key=cv2.contourArea) # 获取最小外接矩形参数 rect = cv2.minAreaRect(cnt) angle = rect[2] # 校正旋转角度 if angle < -45: angle = 90 + angle # 生成旋转矩阵并执行旋转 h, w = img.shape[:2] center = (w // 2, h // 2) M = cv2.getRotationMatrix2D(center, -angle, 1.0) rotated_img = cv2.warpAffine(img, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE) # 传入pytesseract识别 import pytesseract text = pytesseract.image_to_string(rotated_img)
二、基准点(Fiducial)方案的适用场景
如果标签边框存在遮挡、模糊等问题,基准点方案精度更稳定:
- 适用前提:电路板上的基准点(如固定位置的圆形/方形标记)在分割图像中清晰可见,且你已预先记录基准点在正置状态下的相对位置。
- 操作步骤:检测分割图像中的基准点,计算当前基准点相对位置与标准位置的角度差,以此角度旋转图像完成校正。
- 优势:不受标签边框完整性影响,若多个标签共享基准点,可实现批量统一校正。
三、提升OCR识别率的额外建议
- 图像预处理:旋转后对图像做高斯去噪、直方图均衡化,增强绿色文字的对比度;也可单独提取绿色通道,过滤其他颜色干扰。
- Tesseract参数优化:指定文字语言(如中文用
lang='chi_sim'),设置--psm 6(假设文字为连续块),或用--oem 3启用默认OCR引擎模式。
内容的提问来源于stack exchange,提问作者Jon Zavialov
相关产品推荐
相关产品推荐

