dyn_threshold算子
动态阈值算子应付以下情况:
对于一些应用来说,确定一个全局阈值是不可能的,比如,因为
没有通用的参考图像来确定阴影校正
图像的背景是非均匀的
物体在局部范围内通常比背景亮些或者黑些
在这种情况下,寺找一个固定阈值来区分物体和背景是丌太容易的
问题: 局部邻域的确定
局部邻域可以由平滑滤波器来确定(比如, mean_image或binomial_filter)
动态阈值算子的经验说明:
滤波的mask尺寸确定了做能分割出来物体的最大尺寸
经验之谈
mean_image的滤波尺寸> 被提取物体的直徂
类似条件应用到Gauss filter
如果滤波掩码尺寸太大,那么相邻非常近的物体将会连在一块
劢态阈值也会返回沿着边缘的处理结果
局部阈值斱法
通过平均图像灰度来确定局部邻域
使用的滤波掩码尺寸大于字符的笔划宽度,推荐2×D+1
选出的所有像素要比局部邻域要黑,也就是比均值滤波后的图像要黑
同常下面两个算子配合使用:
mean_image(Image, ImageMean, 21, 21)
dyn_threshold(Image, ImageMean,Region, 15, 'dark')
一个例子:
下图中需要提取全部的小斑点。其困难有两点:
大斑点与小斑点之间无法通过同一个阈值参数分割,因为灰度值差异太大。
小斑点之间其实也无法使用同一个阀值参数进行分割。道理同上面。
原图:
下面的代码很好的完成了任务要求:
read_image (Image, 'particle') *获取图像 dev_display (Image) *显示图像 threshold (Image, Large, 110, 255) *灰度阈值分割图像 dilation_circle (Large, LargeDilation, 7.5) *圆角膨胀 dev_display (Image) dev_set_draw ('margin') dev_set_line_width (3) dev_set_color ('red') dev_display (LargeDilation) dev_set_draw ('fill') *显示图像 complement (LargeDilation, NotLarge) *返回补集图像,即获得去除大斑点后的图像NotLarge reduce_domain (Image, NotLarge, ParticlesRed) *减去除了NotLarge图像,即去除大斑点后的图像,减少运算 mean_image (ParticlesRed, Mean, 31, 31) *平滑处理图像 dyn_threshold (ParticlesRed, Mean, SmallRaw, 3, 'light') *选择灰度阈值;当前背景之间差异明显时,可以设定全局阈值进行threshold, *但很多情况下由于背景不均一, *目标体经常表现为比背景局部亮一些或暗一些,无法确定全局阈值操作, *需要通过其邻域找到一个合适的阈值进 *行分割。ThresholdImage是参考图像,通过与OrigImage对比找到领域确定阈值, *一般采用平滑滤波算子 *(如mean_image)获取参考图像。offset设定邻域比较的区间范围, *灰度值变化在offset范围内均是可以接受的。 opening_circle (SmallRaw, Small, 2.5) *消除小区域(小于圆形结构元素)和光滑的边界地区 connection (Small, SmallConnection) *显示联通区域 dev_display (Image) *这句不加窗口显示效果会有雪花 dev_set_colored (12) dev_display (SmallConnection) *显示结果图像
下面给出动态阈值算子的三个参数的中间结果图像。
图1: 区域ParticlesRed
图2: 区域Mean
图3 dyn_threshold算子计算后的结果
当前背景之间差异明显时,可以设定全局阈值进行threshold,但很多情况下由于背景不均一,目标体经常表现为比背景局部亮一些或暗一些,无法确定全局阈值操作。
如果对ParticlesRed区域做阈值,你会发现无论怎么调节最小与最大灰度值分割线,都无法分割出如图3那样的全部的小斑点。
这个时候就需要使用算子dyn_threshold
var_threshold算子
这个也属于动态阈值算子。
这个算子有着以下特征:
较好地分开前景和背景
对丌合适的参数设置丌敏感
因为只使用单个算子就能实现,所以编程容易
缺点是相比dyn_threshold而言需要更长的执行时间
下面示例可以很好分离出前景与背景。
rgb1_to_gray(Image, GrayImage) var_threshold(GrayImage, Region, Width, Height, 0.2, 19, 'dark')
watersheds_threshold分水岭阈值算子
如果对比度差异比较少,watersheds_threshold 可以使得相邻的盆地合并
即使在有噪声的条件下,也可以分割区域
watersheds_threshold (GrayImage, Basins, 33)
区域连通算子regiongrowing
regiongrowing(Image : Regions : Row, Column, Tolerance, MinSize : )
区域连通算子( 区域连通算法,将图象被分割为区域 ):
Row:被测试的区域的垂直距离
Column:被测试的区域的水平距离
Tolerance:两个点之间的最大的灰度差距 :|g_1 - g_2| < Tolerance
MinSize:最小的输出区域(记输出的连通区域的尺寸)
例 :regiongrowing (Image, Regions, 3, 3, 6, 100)
原图:
regiongrowing(Image,Regions,3,3,26,55)
处理结果如下图,可以很好的分离了黑白区域!
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!
halocn基础系列教程列表:
Halcon学习(27-1)halcon测量技术:亚像素,亚像素精度
Halcon学习(26)dev_get_preferences的用法
Halcon学习(4-6)Region处理:动态阈值,分水岭
Halcon学习(4-5)Region处理:合并区域,扩大和缩小区域,取区域特征值
Halcon学习(4-4)Region处理: 区域相减,区域求补集
Halcon学习(4-2)Region处理:选择区域,分割图像
Halcon学习(4-1)ROI感兴趣区域,reduce_domain和crop_domain,鼠标绘制区域
视觉检测之产品瑕疵检测
视觉检测之焊点检测
模板匹配/仿射变换
halcon模板匹配 scaled_shape_model模板的另一个例子
Halcon中两种实现旋转的方法rotate_image和affine_trans_image
halcon的 shape_model模板匹配的算子使用流程的总结

