• 作者: 丶布布


文章预览:

  • 一. 前言
  • 二. 理论
  • 三. 实战



一. 前言

        一般图像处理是针对图像做形状的改变,而形态学处理则是对图像进行结构性的改变,而常见的形态学处理就是使用结构元素对二值化图像(图像中的任何像素灰度值不是0就是255)进行处理,包括膨胀(Dilation)、腐蚀(Erosion)、开运算(先腐蚀再膨胀)、闭运算(先膨胀再腐蚀),所以在形态学处理前需要将图像二值化。如果对灰度图进行膨胀、腐蚀等,则会起到增强图像对比度的效果。

  1. 结构元的中心一般来说是放在其重心位置处,但原则上原点的选择是依赖于你要解决的问题的;
  2. 对图像操作时,我们要求结构元是矩形阵列。(在结构元的基础上添加较少的背景元素实现);
  3. 当结构元的中心位于原图像的边界时,要对原图像进行膨胀或腐蚀操作;

        不管是膨胀还是腐蚀,本质都是使用一个结构元素来逐个像素地扫描要被处理的二值化图像,并根据结构元素和待处理的二值化图像关系来确定膨胀或腐蚀结果。


二. 理论

1、膨胀(dilation、dilation_rectangle1、dilation_circle)-增加像素:

        把结构元素B的中心元素(origin)扫描图像的每一个像素,用结构元素与其覆盖的二值图像做平移并集操作,即二值图像的与结构元素B重合部分只要有黑色(0),则结构元素B中心元素(origin)所在的图像位置就置黑色(0);

        如图所示:左边是需要被处理的二值图像,中间是结构元素B,右边是膨胀处理之后的图像。膨胀的方法是:使用结构元素B从左到右,从上到下滑动遍历图像,只要结构元素B上的黑点与二值图像X上的黑点有重合,则就将结构元素B的中心点所在位置的图像像素值置为黑;右边是膨胀后的结果。

[Halcon&图像] 形态学处理(腐蚀、膨胀、开运算、闭运算)_图像处理


2、腐蚀(erosion、erosion_rectangle1、erosion_circle)-减少像素:

       把结构元素B的中心元素(origin)扫描图像的每一个像素,用结构元素与其覆盖的二值图像做平移交集操作,即结构元素与其覆盖的二值图像的重合部分全都为黑色(0),则结构元素的中心点所在的二值图像灰度值才为黑色(0);换而言之,两者重合部分只要有白色(1)则结构元素的中心点所在的二值图像灰度值就为白色(1)。

       如图所示:左边是被处理的图像X(二值图像,我们针对的是黑点),中间是结构元素B,那个标有origin的点是中心点,即当前处理元素的位置。腐蚀的方法是:拿结构元素B的中心点在X上从左到右,从上到下滑动,如果结构元素B与二值图像X有空白交集,则将B的中心点所在的二值图像黑点去掉(变为白—1)。

[Halcon&图像] 形态学处理(腐蚀、膨胀、开运算、闭运算)_计算机视觉_02


膨胀和腐蚀主要用途:

  • 删除噪声
  • 图中个别原素的隔离与不同原素的连接
  • 寻找图中浓密点与空洞

注:对标准矩形或圆形进行等比例扩大或缩小要用上面的算子,扩展比例为3:1,例:dilation_rectangle1 (RegionTrans, RegionDilation, 3, 3) 为对标准矩形区域RegionTrans的长和宽方向各增加一个像素

3、开运算(opening_rectangle1等)-减少像素:先进行腐蚀,然后再膨胀

一般来说,开运算能够去除孤立的小点、毛刺和小桥(即连通两块区域的小点),而总的位置和形状不变。这就是开运算的作用。要注意的是,如果B是非对称的,进行开运算时要用B的对称集Bv膨胀,否则,开运算的结果和原图相比要发生平移。

[Halcon&图像] 形态学处理(腐蚀、膨胀、开运算、闭运算)_ci_03


4、闭运算(closing_rectangle1等)-增加像素:先进行膨胀,然后进行腐蚀一般来说,闭运算能够填平小湖(即小孔),弥合小裂缝,而总的位置和形状不变,比如在OCR字符识别、车牌识别等地方,需要对激光点打印的字体或有一些缺陷的字体进行闭运算,实现连接。同样要注意的是,如果B是非对称的,进行闭运算时要用B的对称集Bv膨胀,否则,闭运算的结果和原图相比要发生平移。

     

[Halcon&图像] 形态学处理(腐蚀、膨胀、开运算、闭运算)_图像处理_04


注意:

1)要与原图像的像素点作比较,新增或去掉的像素点不算。

2)上面我们介绍的是对二值化图像的处理。如果是对灰度图像进行形态学处理,则膨胀和闭运算会使灰度图像变亮,腐蚀和开运算会使灰度图像变暗,这点大家注意下。

 

5、总结:

1)结构元素的形状(圆形,矩形)一般随着要处理的区域形状(圆形、矩形等)的不同而有所不同。比如圆形的结构元素对圆形区域的腐蚀、膨胀效果会更好。
2)结构元素的半径或边长越大,则膨胀、腐蚀效果越强。
3)如果想增加像素,用膨胀或闭运算;如果想减少像素,用腐蚀或开运算。区别在于膨胀和腐蚀的度要大于闭运算和开运算。
4)形态学对二值化区域是改变形状,而对灰度图像是改变图像明暗。
5)开运算一般适合去除边缘毛刺、孔洞等,如果需要对标准圆形或矩形区域四周进行等比例扩大或缩小,可以使用算子dilation_rectangle1、erosion_rectangle1、dilation_circle、erosion_circle算子。


三. 实战

—halcon示例:

* ball.hdev: Inspection of Ball Bonding
* 
dev_update_window ('off')
dev_close_window ()
dev_open_window (0, 0, 728, 512, 'black', WindowID)
read_image (Bond, 'die/die_03')
dev_display (Bond)
set_display_font (WindowID, 14, 'mono', 'true', 'false')
disp_continue_message (WindowID, 'black', 'true')
stop ()
threshold (Bond, Bright, 100, 255)
*将二值化区域转化成一个带方向的矩形,主要用于定位,在ocr识别那块也会用到
shape_trans (Bright, Die, 'rectangle2')
dev_set_color ('green')
dev_set_line_width (3)
dev_set_draw ('margin')
dev_display (Die)
disp_continue_message (WindowID, 'black', 'true')
stop ()
reduce_domain (Bond, Die, DieGrey)
*上面三步就是为了确定处理区域,也就是定位,减少其他不相关区域的干扰
threshold (DieGrey, Wires, 0, 50)
*填充具有给定形状特征的区域中的孔,限制条件是只对面积在1-100的孔洞进行填充
fill_up_shape (Wires, WiresFilled, 'area', 1, 100)
dev_display (Bond)
dev_set_draw ('fill')
dev_set_color ('red')
dev_display (WiresFilled)
disp_continue_message (WindowID, 'black', 'true')
stop ()
*对圆形区域进行开运算--减少像素,即对圆形区域减的是最狠的,
*半径15.5,数值比较大,导致一些小区域直接腐蚀没
*注意不要太小,否则效果不好
opening_circle (WiresFilled, Balls, 15.5)
dev_set_color ('green')
dev_display (Balls)
disp_continue_message (WindowID, 'black', 'true')
stop ()
*将整个区域进行分割、断开
connection (Balls, SingleBalls)
*选择圆度在0.85-1的区域,这步之前要connection,否则整个图是一整个区域,没法挑选
select_shape (SingleBalls, IntermediateBalls, 'circularity', 'and', 0.85, 1.0)
*排序目的:后面按一定顺序显示圆的直径
sort_region (IntermediateBalls, FinalBalls, 'first_point', 'true', 'column')
dev_display (Bond)
dev_set_colored (12)
dev_display (FinalBalls)
disp_continue_message (WindowID, 'black', 'true')
stop ()
*求出最小外接圆
smallest_circle (FinalBalls, Row, Column, Radius)
NumBalls := |Radius|
Diameter := 2 * Radius
meanDiameter := sum(Diameter) / NumBalls
mimDiameter := min(Diameter)
dev_display (Bond)
disp_circle (WindowID, Row, Column, Radius)
dev_set_color ('white')
for i := 1 to NumBalls by 1
    if (fmod(i,2) == 1)
        disp_message (WindowID, 'D: ' + Diameter[i - 1], 'image', Row[i - 1] - 2.7 * Radius[i - 1], max([Column[i - 1] - 60,0]), 'white', 'false')
    else
        disp_message (WindowID, 'D: ' + Diameter[i - 1], 'image', Row[i - 1] + 1.2 * Radius[i - 1], max([Column[i - 1] - 60,0]), 'white', 'false')
    endif
endfor
* dump_window (WindowID, 'tiff_rgb', './ball')
dev_set_color ('green')
dev_update_window ('on')
disp_continue_message (WindowID, 'black', 'true')
stop ()
dev_close_window ()

[Halcon&图像] 形态学处理(腐蚀、膨胀、开运算、闭运算)_ci_05


过程分析:

1)首先、将所有经过二值化处理的区域设置成ROI区域

threshold (Bond, Bright, 100, 255)
*将二值化区域转化成一个带方向的矩形,主要用于定位,在ocr识别那块也会用到
shape_trans (Bright, Die, 'rectangle2')
reduce_domain (Bond, Die, DieGrey)

2)Blob分析(准确定位到球焊):二值化(图像分割)(—>孔洞填充)—>形态学(有时候目标对象处理之后会有小孔洞,也需要填充)—>选择特征区域

*这里选择对圆形区域进行开运算opening_circle--减少像素,因为我们需要得到的是圆形区域
*半径15.5,数值比较大,导致一些小区域直接腐蚀没
*注意不要太小,否则效果不好
opening_circle (WiresFilled, Balls, 15.5)
*将整个区域进行分割、断开
connection (Balls, SingleBalls)
*选择圆度在0.85-1的区域,这步之前要connection,否则整个图是一整个区域,没法挑选
select_shape (SingleBalls, IntermediateBalls, 'circularity', 'and', 0.85, 1.0)

选择特征区域中除了圆度外,还可以通过面积、周长、长宽、矩形度、紧密度等特征提取出自己想要的区域。

注意:

  • 二值化或形态学之后得到的都是一个区域,要在选择特征区域select_shape之前,需要将一整个区域断开connection几个小区域。
  • 了解区域转换shape_trans里面参数外接矩形和凸性的区别

3)排序(按一定顺序标出圆的直径)、求最小外接圆、求直径

技巧:有时候如果形态学效果不好,可以尝试在形态学之前加个connection断开连通域之后在处理,可能效果会好些。

 

—练习:

read_image (Image, 'C:/Users/Administrator/Desktop/1559529523(1).png')
rgb1_to_gray (Image, GrayImage)
*步骤1:
*去掉不需要处理的黑框,因为黑框不做二值化处理,所以shape_trans变换二值化区域形状就可以剔除掉黑边
threshold (GrayImage, Regions, 127, 254)
shape_trans (Regions, RegionTrans,  'rectangle2')
reduce_domain (GrayImage, RegionTrans, ImageReduced)
*步骤2:blob分析
threshold (ImageReduced, Regions, 127, 254)
fill_up_shape (Regions, RegionFillUp, 'area', 1, 100010)
opening_circle (RegionFillUp, RegionOpening, 8)
connection (RegionOpening, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'circularity', 'and', 0.72449, 2)
*步骤3:图像处理已经完成,后面可以完成想要求的东西
area_center (SelectedRegions, Area, Row, Column)
disp_message (3600,'面积:'+Area +'中心点坐标:'+Row+','+Column, 'window', Row, Column, 'black', 'true')

[Halcon&图像] 形态学处理(腐蚀、膨胀、开运算、闭运算)_ci_06


[Halcon&图像] 形态学处理(腐蚀、膨胀、开运算、闭运算)_形态学处理_07


 


戳戳小手帮忙点个免费的赞和关注吧,嘿嘿。