進(jìn)入正題,本篇對(duì)網(wǎng)格缺陷檢測(cè)的思路很簡(jiǎn)單:
動(dòng)態(tài)閾值處理
面積篩選顯示缺陷
opencv實(shí)現(xiàn):
Mat src = imread("D:/opencv練習(xí)圖片/網(wǎng)格缺陷檢測(cè)1.png"); imshow("原圖", src); cvtColor(src, gray, COLOR_RGB2GRAY); GaussianBlur(gray, gray, Size(3, 3), 1, 0); //雙閾值方法 threshold(gray, binary1, 25, 255, THRESH_BINARY); threshold(gray, binary2, 80, 255, THRESH_BINARY_INV); bitwise_and(binary1, binary2, binary); imshow("雙閾值二值化", binary); vector<vector<Point>>contours; findContours(binary, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE, Point()); for (int i = 0; i < contours.size(); i++) { float area = contourArea(contours[i]); if (area>350) { drawContours(src, contours, i, Scalar(0, 0, 255), 2, 8); int baseline = 0; Size textSize = getTextSize("Mesh Not OK", FONT_HERSHEY_SIMPLEX, 1.0, 2, &baseline); rectangle(src, Rect(10, 10, textSize.width, textSize.height + baseline), Scalar(212, 233, 252), -1, 8); putText(src, "Mesh Not OK", Point(10, 5 + textSize.height + baseline), FONT_HERSHEY_SIMPLEX, 1, Scalar(0, 0, 255), 2, 8); } else { int baseline = 0; Size textSize = getTextSize("Mesh OK", FONT_HERSHEY_SIMPLEX, 1.0, 2, &baseline); rectangle(src, Rect(10, 10, textSize.width, textSize.height + baseline), Scalar(212, 233, 252), -1, 8); putText(src, "Mesh OK", Point(10, 5 + textSize.height + baseline), FONT_HERSHEY_SIMPLEX, 1, Scalar(0, 0, 255), 2, 8); } } imshow("缺陷", src);
這里采用的是雙閾值處理。我們可以對(duì)比三種閾值處理的情況:
(1)全局閾值OTSU方法:
可以看到有部分正?锥春途W(wǎng)格相連,會(huì)導(dǎo)致正?锥匆脖粯(biāo)記為缺陷。
(2)自適應(yīng)閾值:
可以看到效果還不錯(cuò)。
(3)雙閾值:
對(duì)比自適應(yīng)閾值,可以看到分割的還是比較明顯一點(diǎn)的。