基于OpenCV的图像缺陷检测:如何用轮廓标记缺陷区域?
图像缺陷检测后续实现步骤
基于你已完成的预处理步骤,接下来可以通过阈值分割-轮廓提取-矩形高亮的流程实现缺陷区域标注,具体操作如下:
1. 阈值分割(突出缺陷区域)
模糊后的灰度图需要通过阈值处理转成二值图像,让缺陷从背景中分离出来。针对不同缺陷类型,可选择两种方式:
- 固定阈值:适合背景与缺陷对比度稳定的场景
- 自适应阈值:适合光照不均、背景灰度波动的场景
示例代码:
# 方式1:固定阈值(可根据实际图像调整阈值参数127、255) _, binary_img = cv2.threshold(blur_image, 127, 255, cv2.THRESH_BINARY_INV) # 方式2:自适应阈值(更适合复杂光照场景) binary_img = cv2.adaptiveThreshold(blur_image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)
2. 提取轮廓
使用OpenCV的findContours函数提取二值图中的轮廓,优先检测最外层轮廓减少冗余:
contours, _ = cv2.findContours(binary_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
3. 筛选有效轮廓并绘制高亮矩形
过滤掉面积过小的噪声轮廓,给真实缺陷区域绘制红色矩形:
# 复制原图用于绘制(避免修改原始输入图) output_img = input_img.copy() # 遍历轮廓,筛选并绘制矩形 for cnt in contours: # 过滤小噪声(面积阈值可根据图像尺寸调整) if cv2.contourArea(cnt) < 50: continue # 获取轮廓的外接矩形坐标 x, y, w, h = cv2.boundingRect(cnt) # 绘制红色矩形(线条宽度设为2) cv2.rectangle(output_img, (x, y), (x+w, y+h), (0, 0, 255), 2)
4. 查看或保存结果
完成绘制后可显示或保存标注好的图像:
# 显示结果 cv2.imshow("Defect Detection Result", output_img) cv2.waitKey(0) cv2.destroyAllWindows() # 保存结果到本地 cv2.imwrite("defect_result.png", output_img)
调整建议
- 阈值参数、面积筛选阈值需要根据你的实际图像微调,比如颜色缺陷可能需要把
THRESH_BINARY_INV改为THRESH_BINARY - 对于细长的裂纹/划痕,可先通过
cv2.dilate(膨胀)操作增强轮廓后再提取,避免轮廓断裂
内容的提问来源于stack exchange,提问作者Ammar Hafeez
相关产品推荐
相关产品推荐

