Python线图案缺陷检测:线宽测量现有方案优化建议咨询
线图案缺陷检测中线厚度测量的优化方案
现有流程梳理
- 步骤1:OpenCV自适应阈值处理
- 步骤2:在缺陷区域中心放置mask
- 步骤3:通过
cv2.minAreaRect()获取矩形宽度作为线宽
针对性优化建议
1. 自适应阈值参数动态调优
- 不要固定
blockSize和C值,根据缺陷区域的尺寸动态调整:缺陷框宽高较小时,减小blockSize(保证为奇数)避免线条断裂;尺寸较大时适当增大参数。示例代码:h, w = defect_roi.shape[:2] block_size = max(3, min(h, w) // 8 * 2 + 1) # 确保为奇数 adaptive_thresh = cv2.adaptiveThreshold(defect_roi, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, block_size, 2) - 对比
ADAPTIVE_THRESH_MEAN_C和ADAPTIVE_THRESH_GAUSSIAN_C两种模式,选择更适配你场景的阈值计算方式。
2. Mask放置逻辑适配线条走向
- 不要仅固定在区域中心,先通过霍夫变换检测线条角度,再将mask沿线条方向放置,确保完全覆盖目标线条。示例:
lines = cv2.HoughLinesP(thresh_roi, 1, np.pi/180, threshold=20, minLineLength=w//2, maxLineGap=5) if lines is not None: line = lines[0][0] angle = np.arctan2(line[3]-line[1], line[2]-line[0]) * 180 / np.pi # 旋转mask匹配线条角度 mask_mat = cv2.getRotationMatrix2D((w//2, h//2), angle, 1.0) rotated_mask = cv2.warpAffine(original_mask, mask_mat, (w, h)) - 调整mask尺寸:宽度设为预估线厚的2-3倍,长度设为缺陷区域宽度的1/2,避免覆盖无关噪点或遗漏线条。
3. 线宽测量方法升级
- 替代
cv2.minAreaRect(),尝试垂直投影法:对mask覆盖的二值图,沿垂直线条方向做像素投影,统计非零像素区间的平均宽度,结果更贴合实际线厚。示例:# 假设已通过霍夫变换得到线条角度angle proj_angle = angle + 90 # 旋转图像使线条水平,便于垂直投影 rot_mat = cv2.getRotationMatrix2D((w//2, h//2), proj_angle, 1.0) rotated_roi = cv2.warpAffine(thresh_roi, rot_mat, (w, h)) # 计算垂直方向像素投影 projection = np.sum(rotated_roi == 255, axis=1) # 统计非零区间的平均宽度 non_zero_indices = np.where(projection > 0)[0] line_thickness = np.mean(np.diff(non_zero_indices)) if len(non_zero_indices) > 1 else 0 - 结合轮廓分析:用
cv2.findContours()提取线条轮廓,计算轮廓外接矩形的短边长度,或通过cv2.minEnclosingCircle()的等效直径估算线宽。
4. 阈值后处理补全细节
- 对阈值处理后的图像做形态学运算:用小尺寸矩形结构元素先做闭运算填补线条细小断裂,再做开运算去除孤立噪点。示例:
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2)) processed_thresh = cv2.morphologyEx(adaptive_thresh, cv2.MORPH_CLOSE, kernel) processed_thresh = cv2.morphologyEx(processed_thresh, cv2.MORPH_OPEN, kernel)
内容的提问来源于stack exchange,提问作者Suranggi Gautama
相关产品推荐
相关产品推荐

