QQ登录

只需一步,快速开始

halcon工业视觉用blob分析提取公路白色实线

[ 复制链接 ]
blob分析方法可灵活性很强,这里用halcon自带的例程实现公路上白线实现的获取
思路为:
1.在图像指定区域生成网格区域,提取网络区域对应的图像,以缩小图像处理范围。
2.对子图像进行一阶求导,边缘提取,阈值分割,提取出子图像白色线条零散部分。
3.对零散的白色线条区域进行膨胀处理后,再提取其对应和子图像,这样子图像内就比较完整的包含了白色线条。
4.再对子图像进行阈值分割,进取出白色线条。
2019-05-04_135945.jpg
下面为对应的函数
  1. dev_close_window ()
  2. dev_open_window (0, 0, 768, 575, 'black', WindowID)
  3. dev_update_window ('off')
  4. dev_set_line_width (3)
  5. dev_set_color ('green')
  6. MinSize := 30
  7. read_image (ActualImage, 'autobahn/scene_00')
  8. get_system ('init_new_image', Information)
  9. set_system ('init_new_image', 'false')
  10. *生成网格区域
  11. gen_grid_region (Grid, MinSize, MinSize, 'lines', 512, 512)
  12. *提取网格内子区域
  13. clip_region (Grid, StreetGrid, 130, 10, 450, 502)
  14. dev_display (ActualImage)
  15. dev_display (StreetGrid)
  16. stop ()
  17. num := 28
  18. for i := 0 to num by 1
  19. read_image (ActualImage, 'autobahn/scene_' + (i关键有一个函数比较难理解。
  20. sobel_amp(Image : EdgeAmplitude : FilterType, Size : )
  21. [font=Courier New,courier][color=#333333]疑问有:不同的FilterType会产生什么不同的效果,针对什么样的图片选取怎样的FilterType,[/color][/font][font=Courier New,courier][color=#333333]Size的影响是什么等等。[/color][/font]
  22. [color=#333333][font=Tahoma]sobel算子是一个梯度算子,梯度就是所谓的导数,导数在图像中的意义就是边缘和细节等这些灰度值变化剧烈的地方,所以sobel_amp这个算子是用来检测edges,也就是图像的边缘。[/font][/color]
  23. [color=#333333][font=Tahoma]然后amp是amplitude的缩写,翻译为幅度,其实就是向量的模,那么那些Filtertype其实就是各种计算amplitude的办法。[/font][/color]
  24. [color=#333333][font=Tahoma]这里要撇清以前学的那些计算什么距离啊模啊之类的观念,这些数学概念都是人定义的,[/font][/color]
  25. [color=#333333][font=Tahoma]所以模并不是只有我们以前学到的sqrt(a^2 + b^2)这一种计算方法。[/font][/color]
  26. [color=#333333][font=Tahoma]所以不要纠结这么多滤波器类型选择哪一种,其实都没有多大的差别,一般情况下你就用默认的那个就行。[/font][/color]
  27. [color=#333333][font=Tahoma]
  28. [/font][/color]
  29. [color=#333333][font=Tahoma]Size就是滤波器的大小啊,比如你要用3*3还是5*5,这个大小的主要区别在于,如果使用的3*3,由于sobel算子的定义就是这个大小,[/font][/color]
  30. [color=#333333][font=Tahoma]所以直接就按照sobel梯度的计算方式去计算导数,如果使用的size比3*3要大,[/font][/color]
  31. [color=#333333][font=Tahoma]那么就会先对图像进行一个平滑(Gauss平滑,Gauss平滑的模版大小是你在这里选择的size-2),然后再进行梯度的计算,以检测边缘等信息。[/font][/color]
  32. [color=#333333][font=Tahoma]那么直接检测和先平滑再检测的区别是什么?就是有时候图像会包含一些小的噪声,比如椒盐噪声,如果直接检测,[/font][/color]
  33. [color=#333333][font=Tahoma]那么这些噪声点也会有很强的响应,也会被检测到。然而这个时候如果对图像先进行一次Gauss平滑除去一定的噪声,那么检测效果就更好![/font][/color]
  34. [color=#333333][font=Tahoma]
  35. [/font][/color]
  36. [color=#333333][font=Tahoma]如果从这个模版的size的本质上去理解的话呢,size越大,代表在处理模版中心的那个像素时所考虑的它周围的邻域越大,[/font][/color]
  37. [color=#333333][font=Tahoma]也就是这个像素点周围更多的像素被考虑进来,如果这样理解的话,因为是在计算导数,也就是灰度值的变化剧烈程度,那么从原理上来说size越大,[/font][/color]
  38. [color=#333333][font=Tahoma]对一些粗一些的边缘检测效果更好,反之,size越小,对细一些的边缘效果更好。但是大部分情况下都是用3*3或者5*5.[/font][/color]
  39. [color=#333333][font=Tahoma]
  40. [/font][/color]
  41. 02'))
  42. *获取网格对应图像
  43. reduce_domain (ActualImage, StreetGrid, Mask)
  44. *计算一阶导数,提取边缘
  45. sobel_amp (Mask, Gradient, 'sum_abs', 3)
  46. threshold (Gradient, Points, 20, 255)
  47. *区域膨胀处理
  48. dilation_rectangle1 (Points, RegionDilation, MinSize, MinSize)
  49. *提取区域对应图像
  50. reduce_domain (ActualImage, RegionDilation, StripGray)
  51. *提取灰度值大的部分表示路上白线
  52. threshold (StripGray, Strip, 190, 255)
  53. fill_up (Strip, RegionFillUp)
  54. dev_display (ActualImage)
  55. dev_display (RegionFillUp)
  56. if(i>=num)
  57. i:=0
  58. endif
  59. endfor
  60. dev_set_line_width (1)
  61. dev_update_window ('on')
  62. set_system ('init_new_image', Information)
复制代码
关键有一个函数比较难理解。
sobel_amp(Image : EdgeAmplitude : FilterType, Size : )
疑问有:不同的FilterType会产生什么不同的效果,针对什么样的图片选取怎样的FilterType,Size的影响是什么等等。
sobel算子是一个梯度算子,梯度就是所谓的导数,导数在图像中的意义就是边缘和细节等这些灰度值变化剧烈的地方,所以sobel_amp这个算子是用来检测edges,也就是图像的边缘。
然后amp是amplitude的缩写,翻译为幅度,其实就是向量的模,那么那些Filtertype其实就是各种计算amplitude的办法。
这里要撇清以前学的那些计算什么距离啊模啊之类的观念,这些数学概念都是人定义的,
所以模并不是只有我们以前学到的sqrt(a^2 + b^2)这一种计算方法。
所以不要纠结这么多滤波器类型选择哪一种,其实都没有多大的差别,一般情况下你就用默认的那个就行。


Size就是滤波器的大小啊,比如你要用3*3还是5*5,这个大小的主要区别在于,如果使用的3*3,由于sobel算子的定义就是这个大小,
所以直接就按照sobel梯度的计算方式去计算导数,如果使用的size比3*3要大,
那么就会先对图像进行一个平滑(Gauss平滑,Gauss平滑的模版大小是你在这里选择的size-2),然后再进行梯度的计算,以检测边缘等信息。
那么直接检测和先平滑再检测的区别是什么?就是有时候图像会包含一些小的噪声,比如椒盐噪声,如果直接检测,
那么这些噪声点也会有很强的响应,也会被检测到。然而这个时候如果对图像先进行一次Gauss平滑除去一定的噪声,那么检测效果就更好!


如果从这个模版的size的本质上去理解的话呢,size越大,代表在处理模版中心的那个像素时所考虑的它周围的邻域越大,
也就是这个像素点周围更多的像素被考虑进来,如果这样理解的话,因为是在计算导数,也就是灰度值的变化剧烈程度,那么从原理上来说size越大,
对一些粗一些的边缘检测效果更好,反之,size越小,对细一些的边缘效果更好。但是大部分情况下都是用3*3或者5*5.


回复

使用道具 举报

快速回复 返回列表 客服中心 搜索