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
(待续,先睡觉)