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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:35:50