Matlab基于腐蚀和膨胀的边缘检测
腐蚀:删除对象边界某些像素。
膨胀:给图像中的对象边界添加像素。
在操作中,输出图像中所有给定像素的状态都是通过对输入图像的相应像素及邻域使用一定
的规则进行确定。在膨胀操作时,输出像素值是输入图像相应像素邻域内所有像素的最大值。
在二进制图像中,如果任何像素值为1,那么对应的输出像素值为1;而在腐蚀操作中,输
出像素值是输入图像相应像素邻域内所有像素的最小值。在二进制图像中,如果任何一个像
素值为0,那么对应的输出像素值为0。
结构元素的原点定义在对输入图像感兴趣的位置。对于图像边缘的像素,由结构元素定义的
正则化损伤识别matlab邻域将会有一部分位于图像边界之外。为了有效处理边界像素,进行形态学运算的函数通常
都会给出超出图像、未指定数值的像素指定一个数值,这样就类似于函数给图像填充了额外
的行和列。对于膨胀和腐蚀操作,它们对像素进行填充的值是不同的。
对于二进制图像和灰度图像,膨胀和腐蚀操作使用的填充方法如下表:
腐蚀和膨胀填充图像规则表
规则
超出图像边界的像素值定义为该数据类型允许的最大值,对于二进制图像,这些像素值设置为1;对于灰度图像,腐蚀
unit8类型的最小值也为255。
超出图像边界的像素值定义为该数据类型允许的最小值,对于二进制图像,这些像素值设置为0;对于灰度图像,膨胀
unit8类型的最小值也为0。
通过对膨胀操作使用最小值填充和对腐蚀操作使用最大值填充,可以有效地消除边界效应
(输出图像靠近边界处的区域与图像其它部分不连续)。否则,如果腐蚀操作使用最小值进
行填充,则进行腐蚀操作后,输出图像会围绕着一个黑边框。
结构元素:膨胀和腐蚀操作的最基本组成部分,用于测试输出图像,通常要比待处理的图像
小的多。二维平面结构元素由一个数值为0或1的矩阵组成。结构元素的原点指定了图像中
需要处理的像素范围,结构元素中数值为1的点决定结构元素的邻域像素在进行膨胀或腐蚀
操作时是否需要参与计算。三维或非平面的结构元素使用0,1定义结构元素在x和y平面
上的范围,第三维z定义高度。
(1)任意大小和维数的结构元素B原点坐标的获取:
>> origin = floor((size(nhood)+1)/2)
其中nhood 是指结构元素定义的邻域(STREL对象的属性nhood)
(2)创建结构元素:(strel函数来创建任意大小和形状的STREL 对象,支持如线形line、钻石形diamond、圆盘形disk、球形ball等许多种常用的形状)
>> se = strel ('diamond' ,3)
se =
Flat STREL object containing 25 neighbors.
Decomposition: 3 STREL objects containing a total of 13 neighbors
Neighborhood:
0 0 0 1 0 0 0
0 0 1 1 1 0 0
0 1 1 1 1 1 0
1 1 1 1 1 1 1
0 1 1 1 1 1 0
0 0 1 1 1 0 0
0 0 0 1 0 0 0
% se返回了结构元素的有关信息。
(3) 结构元素的分解
为了提高执行效率,stel函数可能会将结构元素拆为较小的块,这种技术称为结构元素的分解。例如要对一个11×11的正方形结构元素进行膨胀操作,可以首先对1×11的结构元素进行膨胀操作,然后再对11×1的结构元素进行膨胀,通过这样的分解,在理论上可以使执行速度提高6.5倍。
对圆盘形和球形结构元素进行分解,其结构是近似的,而对于其他形状的分解,得到的分解结果是精确的。可以调用getsequence函数来查看分解所得的结构元素序列。
>> seq=getsequence(sel)
seq =
4x1 array of STREL objects
>> seq(1)
ans =
Flat STREL object containing 5 neighbors. Neighborhood:0 1 0
1 1 1
0 1 0
>> seq(2)
ans =
Flat STREL object containing 4 neighbors. Neighborhood:0 1 0
1 0 1
0 1 0
>> seq(3)
ans =
Flat STREL object containing 4 neighbors. Neighborhood:0 0 1 0 0
0 0 0 0 0
1 0 0 0 1
0 0 0 0 0
0 0 1 0 0
>> seq(4)
Flat STREL object containing 4 neighbors.
Neighborhood:0 1 0
1 0 1
0 1 0
1.图像膨胀的Matlab实现:
可以使用imdilate函数进行图像膨胀,imdilate函数需要两个基本输入参数,即待处理的输入图像和结构元
素对象。结构元素对象可以是strel函数返回的对象,也可以是一个自己定义的表示结构元素邻域的二进制矩阵。此外,imdilate还可以接受两个可选参数:PADOPT(padopt) ——影响输出图片的大小、PACKOPT(packopt).——说明输入图像是否为打包的二值图像(二进制图像)。举个实例如下:
步骤1,首先创建一个包含矩形对象的二值图像矩阵。
>> BW=zeros(9,10);
>> BW(4:6,4:7) =1
BW =
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 0 0 0
0 0 0 1 1 1 1 0 0 0
0 0 0 1 1 1 1 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
步骤2,使用一个3×3的正方形结构元素对象对创建的图像进行膨胀。
>> SE=strel('square',3)
SE =
Flat STREL object containing 9 neighbors.
Neighborhood:1 1 1
1 1 1
步骤3,将图像BW和结构元素SE传递给imdilate函数。>> BW2=imdilate(BW,SE)
BW2 =
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 1 1 1 1 1 1 0 0
0 0 1 1 1 1 1 1 0 0
0 0 1 1 1 1 1 1 0 0
0 0 1 1 1 1 1 1 0 0
0 0 1 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
步骤4,显示结果。
>> imshow(BW,'notruesize')
>> imshow(BW2,'notruesize')
膨胀前后效果图:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。