導讀
本文主要介紹一個複雜背景下缺陷檢測的執行個體,并将Halcon實作轉為OpenCV。
執行個體來源
執行個體來源于51Halcon論壇的讨論貼:
https://www.51halcon.com/forum.php?mod=viewthread&tid=1173&extra=page%3D1
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5CNzQTN0gzN3MjNhhDOxUGNzYzX0UzNwETM4EzLcBTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
Halcon實作
參考回帖内容,将代碼精簡如下:
read_image (Image, './1.bmp')
dev_set_line_width (3)
threshold (Image, Region, 30, 255)
reduce_domain (Image, Region, ImageReduced)
mean_image (ImageReduced, ImageMean, 200, 200)
dyn_threshold (ImageReduced, ImageMean, SmallRaw, 35, 'dark')
opening_circle (SmallRaw, RegionOpening, 8)
closing_circle (RegionOpening, RegionClosing, 10)
connection (RegionClosing, ConnectedRegions)
dev_set_color ('red')
dev_display (Image)
dev_set_draw ('margin')
dev_display (ConnectedRegions)
如上圖所示,可以較好的定位缺陷位置。
OpenCV實作
分析實作方法與思路:
[1] 原圖轉灰階圖後使用核大小201做中值濾波;
[2] 灰階圖與濾波圖像做差,然後門檻值處理
[3] 圓形核做開運算,去除雜訊
[4] 圓形核做閉運算,缺陷連接配接
[5] 輪廓查找繪制
實作代碼(Python-OpenCV):
import cv2
import numpy as np
img = cv2.imread('./1.bmp')
cv2.imshow('src',img)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
mean = cv2.medianBlur(gray,201)
cv2.imshow('mean',mean)
#diff = cv2.absdiff(gray, mean)
diff = gray - mean
cv2.imshow('diff',diff)
cv2.imwrite('diff.jpg',diff)
_,thres_low = cv2.threshold(diff,150,255,cv2.THRESH_BINARY)#二值化
_,thres_high = cv2.threshold(diff,220,255,cv2.THRESH_BINARY)#二值化
thres = thres_low - thres_high
cv2.imshow('thres',thres)
k1 = np.zeros((18,18,1), np.uint8)
cv2.circle(k1,(8,8),9,(1,1,1),-1, cv2.LINE_AA)
k2 = np.zeros((20,20,1), np.uint8)
cv2.circle(k2,(10,10),10,(1,1,1),-1, cv2.LINE_AA)
opening = cv2.morphologyEx(thres, cv2.MORPH_OPEN, k1)
cv2.imshow('opening',opening)
closing = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, k2)
cv2.imshow('closing',closing)
contours,hierarchy = cv2.findContours(closing, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
(x, y, w, h) = cv2.boundingRect(cnt)
if w > 5 and h > 5:
#cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
cv2.drawContours(img,contours,-1,(0,0,255),2)
cv2.drawContours(img,cnt,2,(0,0,255),2)
cv2.imshow('result',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
print('Done!')
逐漸效果示範
濾波效果:mean
做差效果:diff
門檻值效果:thres
開運算效果:opening
閉運算效果:closing
輪廓查找繪制最終結果:
結尾語
[1] 算法隻是針對這一張圖檔,實際應用為驗證算法魯棒性還需大量圖檔做測試方可;
[2] 缺陷檢測如果用傳統方法不易實作,可以考慮使用深度學習分割網絡如:mask-rcnn、U-net