首页 > 代码库 > Halcon阈值化算子dual_threshold和var_threshold的理解

Halcon阈值化算子dual_threshold和var_threshold的理解

Halcon中阈值二值化的算子众多,通常用得最多的有threshold、binary_threshold、dyn_threshold等。

 

threshold是最简单的阈值分割算子,理解最为简单;binary_threshold是自动阈值算子,它可以自动选出暗(dark)的区域,或者自动选出亮(light)的区域,理解起来也没有难度。

 

动态阈值算子dyn_threshold理解起来稍微复杂一点,使用dyn_threshold算子的步骤基本是这样的:

① 将原图进行滤波模糊处理。

② 用原图和模糊后的图逐个像素做比较,它可以根据参数分割出原图比模糊后的图灰度高(或者低)若干个灰度值的区域。

举例如下:

技术分享

处理程序是这样的:

1 read_image (Image, C:/Users/happy xia/Desktop/dynPic.png)2 mean_image (Image, ImageMean, 9, 9)3 dyn_threshold (Image, ImageMean, RegionDynThresh, 10, ‘dark‘)

程序分析:本例中,将图片模糊后,点阵字的黑色扩散了,随之就是字的黑色不如原图那么黑了,那么通过给定的限值“10”和“dark”,就可以将原图比模糊后的图暗10个灰阶以上的区域(即黑色文字部分)选出来了。

 

 以上所说的三个算子并不是本文的重点,但却是理解下面的两个阈值分割算子的准备知识。

 

1、dual_threshold

先看程序和效果图再分析。

 技术分享

1 read_image (Image, C:/Users/happy xia/Desktop/2.png)2 dual_threshold (Image, RegionCrossings, 174, 200, 180)

技术分享

dual_threshold(Image : RegionCrossings : MinSize, MinGray, Threshold : )

该算子签名中:Threshold 表示用于分割的阈值数值,MinSize表示分割出来的区域的最小面积(即数像素的数目个数),MinGray表示分割出来的区域对应的原图中图像像素的最高灰度不能低于MinGray设定值。

 

注意图中蓝色矩形小色块的面积是175个像素,因此当MinSize = 174时,它可以被分割出来。

 

OK,我知道这么说比较拗口。下面我边改变参数边观察效果图,并做简要分析:

1 read_image (Image, C:/Users/happy xia/Desktop/2.png)2 dual_threshold (Image, RegionCrossings, 176, 200, 180)

效果图如下:

技术分享

由于最小面积设置为176,那么面积为175像素的矩形小色块就没有被分割出来。

 

再来改变MinGray参数:

1 read_image (Image, C:/Users/happy xia/Desktop/2.png)2 dual_threshold (Image, RegionCrossings, 176, 216, 180)

技术分享

此时观察到,最右边那个齿轮本来分割出来的区域没有了!

 

通过取色器观察可知,这块区域最亮的灰度大概比211高一点点。

技术分享

 

我们把这个值略微调低再看看:

1 read_image (Image, C:/Users/happy xia/Desktop/2.png)2 dual_threshold (Image, RegionCrossings, 176, 210, 180)

技术分享

最右边那个齿轮右下角那一块又被分割出来了!

 

相信通过这样参数的反复调节,大家已经彻底明白了dual_threshold算子的意义和用法。

 

我们看这个算子的名称——dual是“双”的意思,也就是双阈值。如果我们让参数列表中的MinGray = Threshold,那就是单阈值了。

1 read_image (Image, C:/Users/happy xia/Desktop/2.png)2 dual_threshold (Image, RegionCrossings, 176, 180, 180)

这个算子是很高效的。如果要完成上面这个程序这样的功能,用threshold算子的话,代码要这样写:

1 read_image (Image, C:/Users/happy xia/Desktop/2.png)2 threshold (Image, Region, 180, 255)3 connection (Region, ConnectedRegions)4 select_shape (ConnectedRegions, SelectedRegions, area, and, 176, 9999999)

也就是说dual_threshold一条算子顶这三条算子。

 

dual_threshold算子的缺陷:它只能分割出灰度值高的亮区域,不能分割出灰度值低的暗区域。

 

下面介绍var_threshold算子。

 

2、var_threshold

 

(待续,先睡觉)

Halcon阈值化算子dual_threshold和var_threshold的理解