導讀
本文主要介紹OpenCV在低對比度缺陷檢測中的應用執行個體。
執行個體一(LCD螢幕髒污檢測)
參考執行個體來源:
https://stackoverflow.com/questions/27281884/low-contrast-image-segmentation
測試圖像:
标注髒污區域:
分析與說明:上圖中的髒污圖像因為對比度較低,是以無法通過常用的門檻值方法處理提取,有時人眼觀察也較費勁。常用的方法有梯度提取或頻域提取。
連結主題中提到了Kmeans聚類分割後提取:
二分類:
三分類:
乍一看效果還不錯,但問題是我到底應該設定幾個類别?第一張圖我如何确定哪個區域正好是我的缺陷部分?本文采用了梯度方法來檢測。
實作步驟與示範
實作步驟:
① 圖像濾波--濾除雜訊;
② Sobel提取邊緣;
③ 形态學處理剔除雜訊;
④ 門檻值提取--分割髒污區域;
⑤ 輪廓提取與标注。
圖像一:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray,(15,15),0)
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)
k1=np.ones((11,11), np.uint8)
thres = cv2.morphologyEx(thres, cv2.MORPH_ERODE, k1)#膨脹操作
cv2.imshow('MORPH_ERODE',thres) #結果顯示
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)
圖像二: