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