python图像缺陷识别算法_利用python-OpenCV对成像有瑕疵的图片进行检测...

python图像缺陷识别算法_利⽤python-OpenCV对成像有瑕疵
的图⽚进⾏检测
任务
利⽤路由器将海康⼯业相机成像传递给⼯控机的过程中,部分图像出现成⾏的绿线,如下图所⽰,⽤python-OpenCV进⾏处理,追求在最短的时间内检测出有瑕疵的图⽚进⾏排除。
图1
使⽤halcon18进⾏协助,按住CTRL,光标会显⽰该像素点的坐标以及gb,很⽅便发现绿线的rgb分别是(0,136,0)
思路:通道分离》⼆值化》遍历像素点的像素,出符合条件像素,就进⾏累加》遍历完⼀⾏的像素点的像素值,对累加值与图⽚宽进⾏⽐较,判断是否是绿线。
第⼀次程序
但是缺点⼗分明显,图⽚⼤,600万像素,遍历⼗分耗时,对图⽚的长宽都进⾏了缩放,再进⾏处理,缩⼩5倍,代码如下1 importcv2 as cv2 importtime3
4 startTime =time.time()
5 img = cv.imread(r'C:\Users\Administrator\Desktop\2\07.bmp')6
7 imgInfo =img.shape8 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.shape22
23 num1 =024 s =025 for i inrange(h):26 n = num1/w27 if n >= 0.2: #排除噪⾳⼲扰
28 s += 1
29 num1 =030 for j inrange(w):31 if thresh1[i,j] ==0:32 num1 += 1
33 print('总共有'+str(s) +'条绿线')34
35 endTime =time.time()36 uesTime = endTime-startTime37 print('总共花了'+str(uesTime) +'秒')38
39 cv.waitKey(0)40 cv.destroyAllWindows()
图像识别结果:只有4条线,完全不符合实际结果
不对图像进⾏缩放
仅仅对⼀张图⽚进⾏检测就耗时太久了,不符合实际项⽬要求。
第⼆次程序
解决⽅法:同时对图像的⾏与列进⾏压缩会使绿线的航速变少,为了减少程序时间,对图像进⾏列(宽)压缩,⾏(⾼)不变。
1 importcv
2 as cv2 importtime3
4 startTime =time.time()
5 img = cv.imread(r'C:\Users\Administrator\Desktop\2\07.bmp')6
7 imgInfo =img.shape8 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.shape22
23 num1 =024 s =025 for i inrange(h):26 n = num1/w27 if n >= 0.2: #排除噪⾳⼲扰
28 s += 1
29 num1 =030 for j inrange(w):31 if thresh1[i,j] ==0:32 num1 += 1
33 print('总共有'+str(s) +'条绿线')34
35 endTime =time.time()36 uesTime = endTime-startTime37 print('总共花了'+str(uesTime) +'秒')38
39 cv.waitKey(0)40 cv.destroyAllWindows()
⼆值化处理图像效果如下(缩放为0.2,0.2):
将宽压缩了⼗倍,绿线检测数量不变,时间直接减少将近⼗倍。对⼆⼗张图像进⾏检测,这种算法对⽬标缺陷检测⽆⼲扰,但能有效缩减时间。但是还是存在噪⾳⼲扰。
最后程序
增加了图⽚不同通道图⽚的像素相减,代替了单纯的⼆值化处理
1 importcv
2 as cv2 importtime3
4 startTime =time.time()
5 img = cv.imread(r'C:\Users\Administrator\Desktop\2\07.bmp')6
7 imgInfo =img.shape8 height =imgInfo[0]9 width = imgInfo[1]10
11 dstHeight = int(height*1)12 dstWdth = int(width*0.01)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 sub_b_g =cv.subtract(g,r) # 相减20 sub_b_g1 =cv.subtract(sub_b_g,b)21
22 #cv.imshow('chafen', sub_b_g2)
23 #cv.imwrite(r'C:\Users\Administrator\Desktop\2\07_2.bmp',sub_b_g2) # 保存图⽚
24 h,w =sub_b_g1.shape25
26 num1 =027 s =028 for i inrange(h):29 n = num1/w30 if n >= 0.2: #排除噪⾳⼲扰
31 s += 1
32 num1 =033 for j inrange(w):34 if sub_b_g1[i,j] == 136:35 num1 += 1
36 print('总共有'+str(s) +'条绿线')37
38 endTime =time.time()39 uesTime = endTime-startTime40 print('总共花了'+str(uesTime) +'秒')41 42
43 cv.waitKey(0)44 cv.destroyAllWindows()
通道相减处理图像效果如下(缩放为0.2,0.2):
时间⽆太⼤变化,阈值取值更加简单明确,绿线检测数量⼀样。

本文发布于:2024-09-22 07:03:19,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/371124.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:图像   绿线   时间
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议