阿里云建网站费用,上海网站建设觉策动力,p2p 网站开发,排名好的移动网站建设Halcon算子学习#xff1a;图像阈值分割算子前言1.threshold-全局固定阈值分割2.Binary Threshold-自动全局阈值分割3.dyn_threshold-局部动态阈值分割小结#xff1a;4.var_threshold算子-均值和标准偏差局部阈值分割5.dual_threshold-双重阈值分割#xff08;有符号图像的…
Halcon算子学习图像阈值分割算子前言1.threshold-全局固定阈值分割2.Binary Threshold-自动全局阈值分割3.dyn_threshold-局部动态阈值分割小结4.var_threshold算子-均值和标准偏差局部阈值分割5.dual_threshold-双重阈值分割有符号图像的阈值算子6.auto_threshold-自动全局阈值分割7.fast_threshold-快速全局阈值分割8.watersheds-分水岭算法分割前言
图像二值化是图像分析与处理中最常见最重要的处理手段二值处理方法也非常多。越精准的方法计算量也越大。参考博客
图像处理之常见二值化方法汇总Halcon阈值化算子dual_threshold和var_threshold的理解
1.threshold-全局固定阈值分割
threshold(Image : Region : MinGray, MaxGray : ) ——使用全局固定阈值分割图像 阈值从输入图像中选取灰度值g满足以下条件的像素点 满足条件的图像的所有点作为一个区域返回。如果传递多个灰度值间隔(MinGray和MaxGray的元组)则每个间隔返回一个单独的区域。对于向量场图像阈值不应用于灰度值而是应用于向量的长度。
应用一利用灰度直方图确定阈值进行图像分割。一般是物体与背景之间存在一个明显的灰度差直方图会存在两个波峰一个是目标一个是背景那么阈值就是物体与背景之间的最小值。
read_image (Image, clip)
*计算直方图
gray_histo (Image, Image, AbsoluteHisto, RelativeHisto)
*将直方图转换为区域包含直方图的区域输入的直方图直方图中心的行/列坐标直方图的比例因子
gen_region_histo (Region, AbsoluteHisto, 255, 255, 1)
*利用直方图获取阈值
histo_to_thresh (AbsoluteHisto,10, MinThresh, MaxThresh)
*期望阈值
TarGetGray:23
for Index : |MinThresh|-1 to 0 by -1if(MinThresh[Index]TarGetGray)MinThresh: MinThresh[Index]breakendifendforfor Index1 : 0 to |MaxThresh|-1 by 1if (MaxThresh[Index1]TarGetGray)MaxThresh:MaxThresh[Index1]breakendifendfor
*全局阈值分割
threshold (Image, Region1, MinThresh, MaxThresh)2.Binary Threshold-自动全局阈值分割
参考 阈值分割算子之OSTU算法binary_threshold binary_threshold(Image : Region : Method, LightDark : UsedThreshold) ——自动全局阈值分割自动确定的全局阈值分割单通道图像并在区域中返回分割后的区域 输入
Image:需要进行阈值的图像Region:处理后的区域
输出
Method:分割方法(‘max_separability’最大限度的可分性, ‘smooth_histo’直方图平滑)LightDark:提取的是黑色部分还是白色部分UsedThreshold:自动阈值使用的阈值值 read_image (Image, clip)binary_threshold (Image, Region, max_separability, dark, UsedThreshold)例如分割均匀照明的背景上有用的字符。binary_threshold还返回UsedThreshold中使用的阈值。 使用的阈值由方法中给出的方法确定。目前该操作符提供了以下两个方法 ’max_separability’最大限度的可分性, ‘smooth_histo’直方图平滑。 这两种方法只能用于具有双峰直方图的图像。如下图
smooth_histo方法提供的功能与操作符bin_threshold提供的功能相同。方法’max_separability’倾向于为UsedThreshold确定较小的值。此外它对柱状图中的稀疏孤立峰不那么敏感而且通常比‘smooth_histo’更快。
最大限度的可分性(max_separability) 通过选择Method ’ max_separability 根据“灰度直方图的阈值选择方法”的灰度直方图自动阈值调用。该算法首先计算图像的直方图然后利用统计矩找到将像素分割为前景和背景的最优阈值并最大化这两个类之间的可分性。此方法仅适用于byte和uint2图像。 如果LightDark ‘light’则选中所有灰度值大于或等于T*的像素。 如果LightDark ‘dark’则选中所有灰色值小于T*的像素。
直方图平滑(smooth_histo) 通过选择Method smooth_histo ’ binary_threshold可以通过以下方式确定阈值首先确定灰度值的相对直方图。然后从直方图提取相关的最小值作为阈值操作的参数。为了减少最小值直方图被平滑处理为一个高斯函数就像在auto_threshold中一样。在平滑直方图中掩模尺寸增大直到最小值。然后阈值设置为这个最小值的位置。 如果LightDark ‘light’则选中所有灰度值大于或等于T*的像素。 如果LightDark ‘dark’则选中所有灰色值小于T*的像素。 3.dyn_threshold-局部动态阈值分割 dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset, LightDark : ) ——局部动态阈值分割 Dynamic Threshold
ThresholdImage是我们用来作为灰度值参考的另外一幅图像在实际使用过程中通常都是对原图像OrigImage进行一次平滑处理然后用平滑处理之后得到的图像作为参考图像。LightDark是问我们提取亮暗还是相似的区域当然这是相对于ThresholdImageOffset其实是在设定一个比较的区间范围因为在图像处理这个主观性本来就比较强的领域中“绝对”这个科学名次实在有点太过分所以什么事情只要在一个合理的范围内我们都是可以接受的而不是死死抓住一个点不放最后也得不到想要的结果。
dyn_threshold 这个算子就是根据一套灰度值比较规则来选择原图像中那些灰度值符合这个公式的像素点。 令 g_{o} g_{OrigImage}; 代表原图中的像素点的灰度值 g_{t} g_{ThresholdImage}代表参考图中的像素点的灰度值 我们的做法是把参考图像的灰度值加上减去一个Offset然后去和原图的像素点逐像素对应地进行比较。
下面看Halcon中给出的这些公式 当参数 LightDark ‘light’ 时 既然选择light那就代表提取相对参考图来说亮一些的地方那么自然要选择那些灰度值比 gt Offset 要大的像素点。 当参数 LightDark ‘dark’ 时 如果要提取的是比参考图要暗一些的区域那么自然要选择比g_t的灰度值要小的那些像素点但是这样直接比较的话提取的小区域太多了并没有很好地提取出相对参考图来说很明显有差别的那部分所以我们才给定Offset这个参数用来修正。这样给参考图的灰度值一减掉Offset提取出来的和参考的之间的差距就会很明显。 当参数 LightDark ‘equal’ 时 选择equal的意思是选择那些和参考图的差不多的只要在这个合理的范围内的都算。 最后, 当 LightDark not_equal’时 反正只要不是差不多的就不选亮的暗的无所谓。
通常阈值图像是原始图像的平滑版本(例如通过应用mean_image、binomial_filter、gauss_filter等)。然后dyn_threshold 的效果类似于将 threshold 应用到经过高通滤波的原始图像上(参见highpass_image)。dyn_threshold可以提取出物体的轮廓其中物体的大小(直径)由低通滤波器的掩码大小和物体边缘的振幅决定:
所选择的模板越大找到的region就会越大。一般来说模板的大小应该是我们要提取的物体直径大小的两倍左右。还有很重要的一点是最好不要把Offset这个变量设置为0因为这样会导致最后找到太多很小的regions而这基本上都是噪声。所以这个值最好是在5-40之间值选择的越大提取出来的regions就会越小。
经过dyn_threshold这个算子处理之后我们就可以提取一个物体的轮廓了具体提取的方法当然要用到什么类似select_shape之类的算子当然这里最重要的是gen_contour_region_xld这个算子用你刚才提取出来的这些区域生成XLD轮廓线这样就达到了提取物体轮廓的目的。 注意我们这样提取出来的所有符合条件的像素点都会被返回到一个region中去所以如果你要分开的区域的话就用connection这个算子再计算一下就好啦。
小结
threshold是最简单的阈值分割算子理解最为简单binary_threshold是自动阈值算子它可以自动选出暗dark的区域或者自动选出亮light的区域理解起来也没有难度。 动态阈值算子dyn_threshold理解起来稍微复杂一点使用dyn_threshold算子的步骤基本是这样的
① 将原图进行滤波模糊处理。
② 用原图和模糊后的图逐个像素做比较它可以根据参数分割出原图比模糊后的图灰度高或者低若干个灰度值的区域。 举例如下 处理代码
read_image (Image, ‘C:/Users/happy xia/Desktop/dynPic.png‘)
mean_image (Image, ImageMean, 9, 9)
dyn_threshold (Image, ImageMean, RegionDynThresh, 10, ‘dark‘)程序分析本例中将图片模糊后点阵字的黑色扩散了随之就是字的黑色不如原图那么黑了那么通过给定的限值“10”和“dark”就可以将原图比模糊后的图暗10个灰阶以上的区域即黑色文字部分选出来了。
4.var_threshold算子-均值和标准偏差局部阈值分割
Halcon阈值化算子dual_threshold和var_threshold的理解
var_threshold(Image : Region : MaskWidth, MaskHeight, StdDevScale, AbsThreshold, LightDark : ) ——均值和标准偏差局部阈值分割能够较好的分开目标和背景对不适合的参数设置不敏感。
MaskWidth、 MaskHeight 是用于滤波平滑的掩膜单元StdDevScale 是标准差乘数因子简称标准差因子AbsThreshold 是设定的绝对阈值LightDark 有4个值可选’light’、’dark’、’equal’、’not_equal’。
var_threshold图像灰度值在均值与方差之和以上或在均值与方差之差以下
1应用示例
var threshold (Image, Region, 4, 4, 0.2, 12, dark )在该程序中,先用4x4的掩膜在图像上逐像素游走,用原图中的当前像素和对应掩膜中16个像素的灰度均值对比,找出暗(dark)的区域。当原图像素灰度比对应的掩膜灰度均值低(0.2,12)个灰阶时本程序中StdDevScale 0.2, AbsThreshold 12,该区域被分割出来。 问题的关键就是理解如何通过StdDevscale和AbsThreshold来确定用于分割的阈值。
2var_threshold的帮助文档
1d(x,y)指的是遍历每个像素时掩膜覆盖的那些像素块本例中是4×4 16个像素灰度的标准差StdDevScale 是标准差因子2当标准差因子StdDevscale0时, v(x.y)取(StdDevscale x 标准差)和AbsThreshold中较大的那个 ;3当标准差因子StdDevScale 0时, v(xy)取(StdDevscale x 标准差)和AbsThreshold中较小的那个。
实测发现这里的比较大小是带符号比较,由于标准差是非负数,当StdDevscale 0时,(StdDevscalex标准差) 0恒成立,所以此时的取值就是(StdDevScale x标准差) 。 帮助文档中StdDevscale的推荐值范围是-1-1,一般通过上面的例子可知,一般的明显的黑白过度处的在50左右,StdDevScale即-50 ~50 ,50的灰度差异,对于一般分割来说足够。 标准差文档还说:推荐的值是0.2,如果参数StdDevScale太大,可能分割不出任何东西;如果参数StdDevScale太小(例如-2) ,可能会把整个图像区域全部输出,也就说达不到有效分割的目的。一般推荐使用该算子时,StdDevScale取正值。 需要强调的是:在黑白过渡处,一般掩膜覆盖的像素的标准差较大,而在其他平缓的地方,标准差较小;因此最终采用的分割值随着掩膜在不断遍历像素的过程中,在(StdDevScale x 标准差)和AbsThreshold之间不断切换。
3var_threshold和dyn_threshold的区别和联系:
var_threshold算子和dyn_threshold算子极为类似,不同的是var threshold集成度更高,并且加入了标准差x标准差因子这一变量。可以有效地减少噪声对分割的影响dyn_threshold是将原图和滤波平滑后的图对比, var_threshold是将原图和对应像素掩膜覆盖的像素的平均,灰度值对比,在算子var_threshold中,如果参数StdDevScale0,那么就可以用动态阈值的方式非常近似地模拟,以上两种算法的效果,极为类似。那么当StdDevScale 0 时var_threshold对比dyn_threshold还存在什么优点呢我认为是在黑白过渡处能减少分割出不需要的区域的概率。因为黑白过渡处标准差大当然前提是StdDevScale 不能设置得太小
5.dual_threshold-双重阈值分割有符号图像的阈值算子
dual_threshold(Image : RegionCrossings : MinSize, MinGray, Threshold : )
MinSize 表示分割出来的区域的最小面积即分割出来的面积要大于MinSizeMinGray 表示分割出来的区域对应的原图中图像像素的最高灰度大于MinGray设定值。threshold 灰度值小于阈值(或大于阈值)的区域被抑制dual_threshold算子的缺陷它只能分割出灰度值高的亮区域不能分割出灰度值低的暗区域
read_image (Image, ‘C:/Users/happy xia/Desktop/2.png‘)
dual_threshold (Image, RegionCrossings1, 174, 200, 180)
dual_threshold (Image, RegionCrossings2, 176, 200, 180)
dual_threshold (Image, RegionCrossings3, 176, 216, 180)* MinGray Threshold 时即为单阈值分割选取灰度值大于180的区域
dual_threshold (Image, RegionCrossings4, 176, 180, 180)源图 RegionCrossings1 RegionCrossings2 RegionCrossings3齿轮右下角灰度值未超过216故无法选取 RegionCrossings4
6.auto_threshold-自动全局阈值分割
auto_threshold(Image : Regions : Sigma : ) ——根据直方图确定阈值自动全局阈值分割
运行原理第一计算灰度直方图。第二高斯平滑后从直方图提取最小值。第三根据提取的最小值进行阈值分割。sigma越大提取区域越少。 read_image (Image, fabrik)median_image (Image, Median, circle, 3, mirrored)auto_threshold (Median, Regions, 3)7.fast_threshold-快速全局阈值分割
fast_threshold(Image : Region : MinGray, MaxGray, MinSize : ) ——快速全局阈值分割
灰度值满足MinGraygMaxGra聚合为一个区域为了节省时间按两步执行。第一先处理行列间隔Minsize的所有像素点。第二处理上一步选择点的领域。和threshold相比分割速度快。
8.watersheds-分水岭算法分割
watersheds(Image : Basins, Watersheds : : ) ——分水岭图像分割。可以分割出分水岭和盆地。 watersheds_threshold(Image : Basins : Threshold : ) ——通过阈值实现图像的分水岭算法分割 read_image (Br2, particle)gauss_filter (Br2, ImageGauss, 9)invert_image (ImageGauss, ImageInvert)watersheds (ImageInvert, Basins, Watersheds)dev_set_draw (margin)dev_set_colored (12)dev_display (Br2)dev_display (Basins)第1步 通过分水岭算法watersheds获取图像的盆地。 第2步 根据第一步分水岭算法分离结果若盆地部分的灰度** threshold**则被合并到一起。设B1和B2分别为相邻盆地的最小灰度值W为将盆地分割为两个盆地的最小灰度值。则分割结果为