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缺陷檢測的資料請關註WalkonNet其它相關文章!

推薦閱讀: