Python+OpenCV实现表面缺陷检测

落日邮差
落日邮差
发布时间:2026-10-15 | 4人浏览过
原创

本文介绍使用Python结合OpenCV库进行精密器件表面缺陷检测的方法。核心流程包括图像二值化去噪、形态学腐蚀与膨胀操作以增强特征,随后进行轮廓检测并筛选符合面积阈值的缺陷区域。通过多阶段处理提高检测精度,最终绘制出缺陷轮廓。

工业检测背景与精度要求

当前许多工业检测场景,尤其是针对精密器件的筛选任务,通常要求达到像素级别的精度,以确保极高的检测准确度。

核心处理流程

主要思想

  • 第一步是将原始图像转换为二值图像,以简化后续处理。
  • 接着对图像执行腐蚀或膨胀处理,以优化图像特征。
  • 随后进行轮廓检测,提取图像中的边界信息。
  • 根据目标尺寸筛选符合条件的轮廓,排除面积过小的误差轮廓。
  • 最后再次进行膨胀处理,并将筛选后的轮廓信息绘制输出。

代码实现与参数设置

import cv2
import os
import numpy as np
import time


t1 = time.time()
img = cv2.imread('./label/28901647.jpg', 0)
img_copy = cv2.imread('./label/28901647.jpg', 0)
mask = np.zeros_like(img)
print(np.shape(img))
# 先利用二值化去除图片噪声
ret, img = cv2.threshold(img, 80, 255, cv2.THRESH_BINARY)




es = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (4, 2))
img = cv2.dilate(img, es, iterations=1)  # 形态学膨胀


kernel = np.ones(shape=[5,5],dtype=np.uint8)
img = cv2.erode(img,kernel=kernel)  # 腐蚀操作

cv2.imshow('aa',img)
cv2.waitKey(0)


contours, _ = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)


n = len(contours)  # 轮廓的个数
cv_contours = []
for contour in contours:
    area = cv2.contourArea(contour)

    if area <= 500:# 筛选面积大于500的,小于500的全部变为255,
        cv_contours.append(contour)
        # 方式一
        # x, y, w, h = cv2.boundingRect(contour) # 这个函数可以获得一个图像的最小矩形边框一些信息,参数img是一个二值图像,它可以返回四个参数,左上角坐标,矩形的宽高 (轮廓集合  contour)
        # img[y:y + h, x:x + w] = 255
        
    else:

        cv2.drawContours(img_copy, [contour], -1, (0, 0, 255), 0) # 多边形轮廓绘制

        print('area:', area)
        continue
# 方式二
cv2.fillPoly(img, cv_contours, (255, 255, 255)) # 多个多边形填充

t2 = time.time()
print('时间:',t2-t1)
cv2.imwrite('./output/28901647.jpg', img)

检测结果展示

1、寻找到的轮廓信息(缺陷)

形态学处理效果

2、通过腐蚀、膨胀后的,筛选出的较大缺陷

多阶段筛选策略

3、通过不同程度的膨胀腐蚀、缺陷面积筛选

总结

以上就是Python+OpenCV实现表面缺陷检测的详细内容,更多关于Python OpenCV缺陷检测的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表