halcon之第3讲--形态学运算以及Blob 连通域分析
文章目录
- 前言
- 形态学运算
- 膨胀
- 腐蚀
- 膨胀腐蚀程序展示
- 开运算
- 闭运算
- 开闭运算程序展示
- 顶帽
- 底帽
- Blob连通域分析
前言
形态学运算
形态学运算是基于图像形状的一组非线性操作,通过结构元素与图像进行卷积,实现膨胀、腐蚀、开闭运算等。常用于图像预处理、去噪、特征提取。
膨胀
dilation_circle(Region : RegionDilation : Radius : )
参数:Region 输入的需要进行膨胀操作的Region ;RegionDilation 是输出的膨胀完成的Region ;由于该算子用圆形卷积核,Radius 是半径大小
- 膨胀(Dilation):就是求局部最大值的操作。
解释:这里面的局部指的是核的大小,例如核大小是3*3的,则二值化的图像在核的范围内取最大值;
作用:可以填充孔洞、连接断裂区域。
腐蚀
erosion_circle(Region : RegionErosion : Radius : )
参数:Region 输入的需要进行腐蚀操作的Region ;RegionErosion 是输出的腐蚀完成的Region ;由于该算子用圆形卷积核,Radius 是半径大小;
- 腐蚀(Erosion):就是求局部最小值的操作。
- 解释:这里面的局部指的是核的大小,例如核大小是3*3的,则二值化的图像在核的范围内取最小值;
- 作用:可以去除噪声,消除小于结构元素的噪声点
膨胀腐蚀程序展示
*程序运行前图像化窗口和设置的恢复 dev_close_window()dev_clear_window()dev_set_color('white')dev_set_draw('fill')dev_set_line_width(1)*读图片 read_image(Image,'pellets')threshold(Image,Dark,120,255)*腐蚀 erosion_circle(Dark,RegionErosion,7.5)*膨胀 dilation_circle(RegionErosion,RegionDilation,7.5)*窗口1:原图 dev_open_window(0,0,400,300,'black',W1)dev_display(Image)disp_message(W1,'原始图像','window',10,10,'black','true')*窗口2:阈值二值区域 dev_open_window(0,420,400,300,'black',W2)dev_display(Dark)disp_message(W2,'阈值分割','window',10,10,'black','true')*窗口3:腐蚀 dev_open_window(320,0,400,300,'black',W3)dev_display(RegionErosion)disp_message(W3,'腐蚀','window',10,10,'black','true')*窗口4:膨胀 dev_open_window(320,420,400,300,'black',W4)dev_display(RegionDilation)disp_message(W4,'膨胀','window',10,10,'black','true')运行结果:
从以上运行结果可以看出腐蚀可以消除小于核的噪点,膨胀可以消除孔洞,链接断裂区域;
开运算
opening_circle(Region : RegionOpening : Radius : )
参数:Region 输入的需要进行开运算操作的Region ;RegionOpening 是输出的开运算完成的Region ;由于该算子用圆形卷积核,Radius 是半径大小;
- 开运算(Opening):先腐蚀后膨胀;
作用:去掉小噪点、孤立小点,物体整体大小几乎不变。适合:阈值后消除背景噪声斑点
闭运算
closing_circle(Region : RegionClosing : Radius : )
参数:Region 输入的需要进行闭运算操作的Region ;RegionClosing 是输出的闭运算完成的Region ;由于该算子用圆形卷积核,Radius 是半径大小;
- 闭运算(Closing):先膨胀后腐蚀;
作用:填补物体内部小孔、小缝隙,把目标内部小洞补上。适合:目标里面有黑洞孔洞。
开闭运算程序展示
dev_close_window()dev_clear_window()dev_set_color('white')dev_set_draw('fill')dev_set_line_width(1)read_image(Image,'pellets')threshold(Image,Dark,120,255)*开运算 opening_circle(Dark,RegionOpening,3.5)*闭运算 closing_circle(Dark,RegionClosing,3.5)*窗口1:原图 dev_open_window(0,0,400,300,'black',W1)dev_display(Dark)disp_message(W1,'原始图像','window',10,10,'black','true')*窗口2:阈值二值区域 dev_open_window(0,420,400,300,'black',W2)dev_display(RegionOpening)disp_message(W2,'阈值分割','window',10,10,'black','true')*窗口3:腐蚀 dev_open_window(320,0,400,300,'black',W3)dev_display(RegionClosing)disp_message(W3,'腐蚀','window',10,10,'black','true')运行结果:
开运算结果和原图对比:
由以上图片结果可以看到开运算消除了背景上的零星小白点;
闭运算结果和原图对比:
由以上图片结果可以看到闭运算消除了目标里面的小孔洞,没有消除背景上的小白点;
顶帽
顶帽和底帽用于提取图像中的亮细节或暗细节。
顶帽(Top Hat):原图与开运算结果的差值,突出亮前景。
- 公式:顶帽 = 原图 − 开运算
- 作用:提取小的凸起碎块、小连通域,这些碎块小于结构元;大于结构元的物体会被过滤掉
read_image(Image,'D:/learn/halcon/4.png')threshold(Image,Region,30,255)gen_circle(SE,20,20,3)*top_hat拿到被开运算去掉的碎点 top_hat(Region,SE,RegionTopPart)dev_open_window(0,0,300,300,'black',W1)dev_display(Region)disp_message(W1,'阈值region:','window',10,10,'red','true')dev_open_window(0,320,300,300,'black',W1)dev_display(RegionTopPart)disp_message(W1,'顶帽:','window',10,10,'red','true')运行结果:
底帽
底帽(Black Hat):闭运算结果与原图的差值,突出暗区域。
- 公式:bottom_hat = closing(Region) − Region
- 作用:提取闭运算填补上的孔洞、缝隙。只拿到被闭运算填掉的那一小块区域,不是处理整张灰度图。
read_image(Image,'D:/learn/halcon/5.png')threshold(Image, Region,0,30)gen_circle(SE,20,20,3)*底帽 bottom_hat(Region, SE, RegionBottomHat)* opening得到清理后的完整区域 * opening_circle(Region, RegionClean,3.5)* count_obj(RegionTopPart, N)*N=0代表没有毛刺可以提取,top_hat自然输出空 dev_open_window(0,0,300,300,'black', W1)dev_clear_window()dev_display(Image)disp_message(W1,'阈值region:','window',10,10,'red','true')dev_open_window(0,320,300,300,'black', W2)dev_clear_window()dev_display(RegionBottomHat)disp_message(W1,'顶帽:','window',10,10,'red','true')Blob连通域分析
Blob(Binary Large Object),在机器视觉里 = 图像中的一块连通前景区域,也就是连通域。
通俗理解:图像里,和背景颜色 / 灰度不一样、互相挨在一起的一团像素,就叫一个 Blob。
比如图片里几颗黑色颗粒,每一颗颗粒就是 1 个 Blob。
举例解释Blob
一张图有 3 个分开的零件:
threshold()阈值分割完,返回1个Region 对象,把3个零件全部打包在一起;
调用connection() → 输出 3 个 Region,3 个 Blob,3 个连通域。
不执行 connection,你拿到的不是 3 个 Blob,是一个大合并区域,后续算面积、重心全部出错。Blob连通域分析流程
Blob 分析 = Blob 连通域分析整套流程:
(1)图像滤波
(2)阈值分割,分出前景背景
(3)connection 拆分出每一个 Blob
(4)根据面积、圆度、长宽筛选 Blob,去掉噪声小点
(5)计算每个 Blob 的位置、大小、角度
适用场景:颗粒计数、孔洞检测、工件定位、印刷污点检测。容易混淆点
(1)Blob 不是图像,是Region 区域对象(Halcon 的 Region 数据类型,不是 Image)
(2)Blob 只关心像素是否相连,不关心像素灰度值,灰度已经在阈值阶段过滤完了。简单一句话总结
Blob = 二值图像中,相互连通的一团前景像素。Blob 分析就是提取、筛选、测量这一团团斑点。
以上内容如果帮到您请点赞收藏,如果有错误欢迎指正!