天天看點

OpenCV實戰 | 低對比度缺陷檢測應用執行個體--LCD螢幕髒污檢測

導讀

本文主要介紹OpenCV在低對比度缺陷檢測中的應用執行個體。

執行個體一(LCD螢幕髒污檢測)

參考執行個體來源:

​​https://stackoverflow.com/questions/27281884/low-contrast-image-segmentation​​

測試圖像:

标注髒污區域:

OpenCV實戰 | 低對比度缺陷檢測應用執行個體--LCD螢幕髒污檢測
OpenCV實戰 | 低對比度缺陷檢測應用執行個體--LCD螢幕髒污檢測

分析與說明:上圖中的髒污圖像因為對比度較低,是以無法通過常用的門檻值方法處理提取,有時人眼觀察也較費勁。常用的方法有梯度提取或頻域提取。

連結主題中提到了Kmeans聚類分割後提取:

二分類:

OpenCV實戰 | 低對比度缺陷檢測應用執行個體--LCD螢幕髒污檢測

三分類:

OpenCV實戰 | 低對比度缺陷檢測應用執行個體--LCD螢幕髒污檢測

乍一看效果還不錯,但問題是我到底應該設定幾個類别?第一張圖我如何确定哪個區域正好是我的缺陷部分?本文采用了梯度方法來檢測。

實作步驟與示範

實作步驟:

① 圖像濾波--濾除雜訊;

② Sobel提取邊緣;

③ 形态學處理剔除雜訊;

④ 門檻值提取--分割髒污區域;

⑤ 輪廓提取與标注。

圖像一:

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray,(15,15),0)      
OpenCV實戰 | 低對比度缺陷檢測應用執行個體--LCD螢幕髒污檢測
x = cv2.Sobel(blur,cv2.CV_16S,1,0,ksize=7)
y = cv2.Sobel(blur,cv2.CV_16S,0,1,ksize=7)
absX = cv2.convertScaleAbs(x) # 轉回uint8
absY = cv2.convertScaleAbs(y)
edged = cv2.addWeighted(absX,1,absY,1,0)
cv2.imshow('Sobel', edged)      
OpenCV實戰 | 低對比度缺陷檢測應用執行個體--LCD螢幕髒污檢測
k1=np.ones((11,11), np.uint8)
thres = cv2.morphologyEx(thres, cv2.MORPH_ERODE, k1)#膨脹操作
cv2.imshow('MORPH_ERODE',thres) #結果顯示      
OpenCV實戰 | 低對比度缺陷檢測應用執行個體--LCD螢幕髒污檢測
contours,hierarchy = cv2.findContours(thres, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
  (x, y, w, h) = cv2.boundingRect(cnt)
  if w > 2 and h > 2:
    cv2.drawContours(img,cnt,-1,(0,0,255),1)      
OpenCV實戰 | 低對比度缺陷檢測應用執行個體--LCD螢幕髒污檢測

圖像二:

OpenCV實戰 | 低對比度缺陷檢測應用執行個體--LCD螢幕髒污檢測
OpenCV實戰 | 低對比度缺陷檢測應用執行個體--LCD螢幕髒污檢測

繼續閱讀