任務
利用路由器將海康工業相機成像傳遞給工控機的過程中,部分圖像出現成行的綠線,如下圖所示,用python-OpenCV進行處理,追求在最短的時間內檢測出有瑕疵的圖片進行排除。
圖1
使用halcon18進行協助,按住CTRL,光標會顯示該像素點的坐標以及gb,很方便發現綠線的rgb分別是(0,136,0)
思路:通道分離》二值化》遍歷像素點的像素,找出符合條件像素,就進行累加》遍歷完一行的像素點的像素值,對累加值與圖片寬進行比較,判斷是否是綠線。
第一次程序
但是缺點十分明顯,圖片大,600萬像素,遍歷十分耗時,對圖片的長寬都進行了縮放,再進行處理,縮小5倍,代碼如下
1 import cv2 as cv 2 import time 3 4 startTime = time.time() 5 img = cv.imread(r'C:\Users\Administrator\Desktop\2\07.bmp') 6 7 imgInfo = img.shape 8 height = imgInfo[0] 9 width = imgInfo[1] 10 11 dstHeight = int(height*0.2) 12 dstWdth = int(width*0.2) 13 dst = cv.resize(img,(dstWdth,dstHeight)) 14 # cv.imshow('dst',dst) 15 16 b,g,r = cv.split(dst) 17 # cv.imshow('green',g) 18 19 ret1, thresh1 = cv.threshold(g,135,255,cv.THRESH_BINARY_INV) 20 # cv.imshow('th',thresh1) 21 h,w = thresh1.shape 22 23 num1 = 0 24 s = 0 25 for i in range(h): 26 n = num1/w 27 if n >= 0.2: # 排除噪音干擾 28 s += 1 29 num1 = 0 30 for j in range(w): 31 if thresh1[i,j] == 0: 32 num1 += 1 33 print('總共有 '+str(s) +' 條綠線') 34 35 endTime = time.time() 36 uesTime = endTime-startTime 37 print('總共花了 '+str(uesTime) +' 秒') 38 39 cv.waitKey(0) 40 cv.destroyAllWindows()
結果:只有4條線,完全不符合實際結果
不對圖像進行縮放
僅僅對一張圖片進行檢測就耗時太久了,不符合實際項目要求。
第二次程序
解決方法:同時對圖像的行與列進行壓縮會使綠線的航速變少,為了減少程序時間,對圖像進行列(寬)壓縮,行(高)不變。
1 import cv2 as cv 2 import time 3 4 startTime = time.time() 5 img = cv.imread(r'C:\Users\Administrator\Desktop\2\07.bmp') 6 7 imgInfo = img.shape 8 height = imgInfo[0] 9 width = imgInfo[1] 10 11 dstHeight = int(height*1) 12 dstWdth = int(width*0.1) 13 dst = cv.resize(img,(dstWdth,dstHeight)) 14 # cv.imshow('dst',dst) 15 16 b,g,r = cv.split(dst) 17 # cv.imshow('green',g) 18 19 ret1, thresh1 = cv.threshold(g,135,255,cv.THRESH_BINARY_INV) 20 # cv.imshow('th',thresh1) 21 h,w = thresh1.shape 22 23 num1 = 0 24 s = 0 25 for i in range(h): 26 n = num1/w 27 if n >= 0.2: # 排除噪音干擾 28 s += 1 29 num1 = 0 30 for j in range(w): 31 if thresh1[i,j] == 0: 32 num1 += 1 33 print('總共有 '+str(s) +' 條綠線') 34 35 endTime = time.time() 36 uesTime = endTime-startTime 37 print('總共花了 '+str(uesTime) +' 秒') 38 39 cv.waitKey(0) 40 cv.destroyAllWindows()
二值化處理圖像效果如下(縮放為0.2,0.2):
將寬壓縮了十倍,綠線檢測數量不變,時間直接減少將近十倍。對二十張圖像進行檢測,這種算法對目標缺陷檢測無干擾,但能有效縮減時間。但是還是存在噪音干擾。
最后程序
增加了圖片不同通道圖片的像素相減,代替了單純的二值化處理
1 import cv2 as cv 2 import time 3 4 startTime = time.time() 5 38 endTime = time.time() 39 uesTime = endTime-startTime 40 print('總共花了 '+str(uesTime) +' 秒') 41 42 43 cv.waitKey(0) 44 cv.destroyAllWindows()
通道相減處理圖像效果如下(縮放為0.2,0.2):
時間無太大變化,閾值取值更加簡單明確,綠線檢測數量一樣。