Halcon形态学处理-腐蚀、膨胀、开运算、闭运算、顶帽运算和底帽运算

提示:文章参考了网络上其他作者的文章,以及相关书籍,如有侵权,请联系作者。


前言

       图像的形态学处理是对图像的局部像素进行处理,用于从图像中提取有意义的局部图像细节。通过改变局部区域的像素形态,以对目标进行增强,或者为后续进行图像分割、特征提取、边缘检测等操作做准备。
       图像的形态学处理包含如下内容。
在这里插入图片描述
       在开始之前,我们先了解一下:结构元素:StructElement。结构元素在算子参数中的名称为StructElement,在腐蚀与膨胀操作中都需要用到。结构元素是类似于“滤波核”的元素,或者说类似于一个“小窗”,在原图上进行“滑动”,这就是结构元素,可以指定其形状和大小。结构元素一般由0和1的二值像素组成。结构元素的原点相当于“小窗”的中心,其尺寸由具体的腐蚀或膨胀算子指定,结构元素的尺寸也决定着腐蚀或者膨胀的程度。结构元素越大,被腐蚀消失或者被膨胀增加的区域也会越大。
       结构元素的形状可以根据操作的需求进行创建,可以是圆形、矩形、椭圆形,甚至是指定的多边形等。可以通过gen_circle、gen_rectanglel、gen_ellipse、gen_region_polygon等算子创建需要的形状并指定尺寸。


一、腐蚀和膨胀

       在经阈值处理提取出目标区域的二值图像之后,区域边缘可能并不理想,这时可以使用腐蚀或使膨胀操作对区域进行“收缩”或“扩张”。

1.腐蚀

       腐蚀操作是对所选区域进行“收缩”的一种操作,可以用于消除边缘和杂点。腐蚀区域的大小与结构元素的大小和形状相关。其原理是使用一个自定义的结构元素,如矩形、圆形等,在二值图像上进行类似于“滤波”的滑动操作,然后将二值图像对应的像素点与结构元素的像素进行对比,得到的交集(进行“与”操作)即为腐蚀后的图像像素。左图为二值化后的图像,右图为使用中间的结构元素对图像进行腐蚀,得到的结果为“收缩”了一圈的图像。
在这里插入图片描述
       经过腐蚀操作,图像区域的边缘可能会变得平滑,区域的像素将会减少,相连的部分可能会断开。即使如此,各部分仍然属于同一个区域。
       Halcon中有许多与腐蚀操作相关的算子,比较常用的有erosion_circle 算子和erosion rectangle1算子,它们分别使用圆形与矩形结构元素对输入区域进行腐蚀操作。这里以erosion_circle算子为例进行说明。erosion_circle算子的原型如下:

    erosion_circle(Region : RegionErosion : Radius :)

       其中各参数的含义如下。
       1)、参数1:Region为输入图像中的区域,该区域往往是由上一环节的某种分割操作得到的输出结果,如阈值处理提取的区域等。
       2)、参数2:RegionErosion为输出的腐蚀后的区域。
       3)、参数3:Radius为圆形结构元素的半径。其具体值取与想要被去除的杂点的大小有关。因为小于这个圆形结构元素的点都会被移除,而该圆形的直径一般是一个奇数,如3、5、7、9等,所以该半径取值一般会取1.5、2.5、3.5、4.5······默认值是3.5。
       注意:圆形的直径取奇数是因为圆形是对称图形,这样做是为了使圆形的中心点坐标为整数。
       下面以一个简单的例子来说明腐蚀操作。下图左图即原始图像,为一幅背景较为复杂的图像。目标是提取较大的面积芯片区域。因此,可以先将图像转化为单通道灰度图像,并使用阈值进行简单的灰度分割。阈值分割图像如中图所示。在满足条件的区域使用erosion_circle 算子移除杂点,erosion_circle算子的输入区域为中图的红色部分,腐蚀的结果如下图右图所示。
在这里插入图片描述
       上图腐蚀操作的代码如下:

read_image(Image, 'board_erosion')
rgb1_to_gray(Image, GrayImage)
threshold(GrayImage, Region, 100, 255)
erosion_circle(Region, RegionErosion, 7.5)
erosion_circle(RegionErosion, RegionErosion2, 6.5)
dev_clear_window()
dev_display(RegionErosion2)

       因为经阈值处理后,图像中会包含背景中的许多杂点和非关键区域,所以这里通过腐蚀操作移除杂点,并且在腐蚀的结果上进行重复腐蚀,以达到理想的结果。腐蚀操作很容易让图像中出现“空洞”,因此可以使用膨胀或者闭运算进行后续处理。
       上文提到的erosion_circle算子是使用圆形结构元素进行腐蚀操作,还可以选择其他形状的结构元素,如erosion_rectangle1 算子是使用矩形结构元素进行腐蚀,用法与erosion_circle 算子类似;也可以使用自定义的结构元素或者其他方式。Halcon中与腐蚀有关的其他算子如下。
       1)、erosion1:用一个自定义的结构元素对输入区域进行腐蚀操作。这个自定义的结构元素需要预先创建,可能是圆形、矩形、多边形,甚至是点,等等。
       2)、erosion2:使用一个参考点对输入区域进行腐蚀操作。这个算子中的结构元素有一个参考点,这个点与erosion1中的点不同,它可以是指定的任意一点。
       3)、erosion_golay:使用的结构元素来自格雷字母表,通过定义结构元素对输入区域进行腐蚀操作。
       4)、erosion_seq:与erosion_golay类似,使用格雷字母表中的元素对输入区域进行连续的腐蚀操作。

2.膨胀

       与腐蚀相反,膨胀是对选区进行“扩大”的一种操作。其原理是使用一个自定义的结构元素,在待处理的二值图像上进行类似于“滤波”的滑动操作,然后将二值图像对应的像素点与结构元素的像素进行对比,得到的并集(进行“或”操作)为膨胀后的图像像素。下面左图为二值化之后的图像,使用一个圆形结构元素对图像进行膨胀操作,如中图所示,得到的结果为“膨胀”了一圈的图像,如右图所示。
在这里插入图片描述
       经过膨胀操作,图像区域的边缘可能会变得平滑,区域的像素将会增加,不相连的部分可能会连接起来,这些都与腐蚀操作正好相反。即使如此,原本不相连的区域仍然属于各自的区域,不会因为像素重叠就发生合并。
       注意:膨胀后发生重叠的区域可以用opening_seq算子分离开来。
       Halcon中有许多与膨胀操作相关的算子,比较常用的有dilation_circle算子和dilation_rectangle1算子,它们分别使用圆形与矩形结构元素对输入区域进行膨胀操作。这里以dilation_circle算子为例进行说明。dilation_circle 算子的原型如下:

    dilation circle(Region : RegionDilation : Radius :)

       其中各参数的含义如下。
       1)、参数1:Region为输入的区域。
       2)、参数2:RegionDilation为输出的膨胀后的区域。
       3)、参数3

  • 25
    点赞
  • 244
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值