利用python-OpenCV對成像有瑕疵的圖片進行檢測


任務

利用路由器將海康工業相機成像傳遞給工控機的過程中,部分圖像出現成行的綠線,如下圖所示,用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):

 時間無太大變化,閾值取值更加簡單明確,綠線檢測數量一樣。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM