天天看點

實戰 | OpenCV實作紡織物缺陷檢測->髒污、油漬、線條破損(詳細步驟 + 代碼)

導讀

本文将介紹使用OpenCV實作紡織物缺陷檢測(髒污、油漬、線條破損缺陷)的詳細步驟 + 代碼。(公衆号:OpenCV與AI深度學習)

 背景介紹

    機器視覺應用場景中缺陷檢測的應用是非常廣泛的,通常涉及各個行業、各種缺陷類型。今天我們要介紹的是紡織物的缺陷檢測,缺陷類型包含髒污、油漬、線條破損三種,這三種缺陷與LCD螢幕檢測的缺陷很相似,處理方法也可借鑒。

髒污缺陷

    髒污缺陷圖檔如下,肉眼可見明顯的幾處髒污,該如何處理?

實戰 | OpenCV實作紡織物缺陷檢測->髒污、油漬、線條破損(詳細步驟 + 代碼)

實作步驟:

【1】使用高斯濾波消除背景紋理的幹擾。如下圖所示,将原圖放大後會發現紡織物自帶的紋理比較明顯,這會影響後續處理結果,是以先做濾波平滑。

實戰 | OpenCV實作紡織物缺陷檢測->髒污、油漬、線條破損(詳細步驟 + 代碼)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (7,7), 0)      

高斯濾波結果:

實戰 | OpenCV實作紡織物缺陷檢測->髒污、油漬、線條破損(詳細步驟 + 代碼)

【2】Canny邊緣檢測凸顯缺陷。Canny邊緣檢測對低對比度缺陷檢測有很好的效果,這裡注意高低門檻值的設定:

edged = cv2.Canny(blur, 10, 30)      

Canny邊緣檢測結果:

實戰 | OpenCV實作紡織物缺陷檢測->髒污、油漬、線條破損(詳細步驟 + 代碼)

【3】輪廓查找、篩選與結果标記。輪廓篩選可以根據面積、長度過濾掉部分幹擾輪廓,找到真正的缺陷。

contours,hierarchy = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
  length = cv2.arcLength(cnt,True)
  if length >= 1:
    cv2.drawContours(img,cnt,-1,(0,0,255),2)      

輪廓篩選标記結果:

實戰 | OpenCV實作紡織物缺陷檢測->髒污、油漬、線條破損(詳細步驟 + 代碼)

油污缺陷

    油污缺陷圖檔如下,肉眼可見明顯的兩處油污,該如何處理?

實戰 | OpenCV實作紡織物缺陷檢測->髒污、油漬、線條破損(詳細步驟 + 代碼)

實作步驟:

【1】将圖像從RGB顔色空間轉到Lab顔色空間。對于類似油污和一些亮團的情況,将其轉換到Lab或YUV等顔色空間的色彩通道常常能更好的凸顯其輪廓。

LabImg = cv2.cvtColor(img, cv2.COLOR_BGR2Lab)
L,A,B = cv2.split(LabImg)      

Lab顔色空間b通道效果:

實戰 | OpenCV實作紡織物缺陷檢測->髒污、油漬、線條破損(詳細步驟 + 代碼)

【2】高斯濾波 + 二值化。

blur = cv2.GaussianBlur(B, (3,3), 0)
ret,thresh = cv2.threshold(blur,130,255,cv2.THRESH_BINARY)      

高斯濾波 + 二值化結果:

實戰 | OpenCV實作紡織物缺陷檢測->髒污、油漬、線條破損(詳細步驟 + 代碼)

【3】形态學開運算濾除雜訊。

k1 = np.ones((3,3), np.uint8)
thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, k1)      

開運算處理結果:

實戰 | OpenCV實作紡織物缺陷檢測->髒污、油漬、線條破損(詳細步驟 + 代碼)

【4】輪廓查找、篩選與結果标記。輪廓篩選可以根據面積、寬高過濾掉部分幹擾輪廓,找到真正的缺陷。

contours,hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
  area = cv2.contourArea(cnt)
  if area >= 50:
    cv2.drawContours(img,cnt,-1,(0,0,255),2)      

輪廓篩選标記結果:

實戰 | OpenCV實作紡織物缺陷檢測->髒污、油漬、線條破損(詳細步驟 + 代碼)

線條破損缺陷

    線條破損缺陷圖檔如下,肉眼可見明顯的一處髒污,該如何處理?

實戰 | OpenCV實作紡織物缺陷檢測->髒污、油漬、線條破損(詳細步驟 + 代碼)

實作步驟:

【1】将圖像從RGB顔色空間轉到Lab顔色空間 + 高斯濾波。

LabImg = cv2.cvtColor(img, cv2.COLOR_BGR2Lab)
L,A,B = cv2.split(LabImg)
blur = cv2.GaussianBlur(B, (3,3), 0)      

B通道高斯濾波結果:

實戰 | OpenCV實作紡織物缺陷檢測->髒污、油漬、線條破損(詳細步驟 + 代碼)

【2】Canny邊緣檢測凸顯缺陷。

edged = cv2.Canny(blur, 5, 10)      

Canny邊緣檢測結果:

實戰 | OpenCV實作紡織物缺陷檢測->髒污、油漬、線條破損(詳細步驟 + 代碼)

【3】輪廓查找、篩選與結果标記。輪廓篩選可以根據面積、長度過濾掉部分幹擾輪廓,找到真正的缺陷。

contours,hierarchy = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
  length = cv2.arcLength(cnt,True)
  if length >= 10:
    cv2.drawContours(img,cnt,-1,(0,0,255),2)      

輪廓篩選标記結果:

實戰 | OpenCV實作紡織物缺陷檢測->髒污、油漬、線條破損(詳細步驟 + 代碼)

後記

    對于上述缺陷大家可以嘗試使用頻域處理方法(如傅裡葉變換等),本文方法僅供參考,實際應用還要根據實際圖像做批量測試和優化。

繼續閱讀