膨胀和腐蚀是两个基本的数学形态学运算。膨胀是将像素添加到图像中物体的边缘,腐蚀则是删除对象边缘的像素。添加或删除的像素数目与用于处理图像的结构元素的大小和形状有关。[大谦MATLAB,dqmatlab点com]
理解膨胀和腐蚀
在数学形态学的膨胀和腐蚀运算中,输出图像中任何已知像素的状态都是通过给输入图像中的对应像素和其相邻像素采用一个运算规则来确定的。表3-1中列出了用于膨胀和腐蚀的规则。
表3-1 灰度膨胀和腐蚀的规则
| 运 算 | 规 则 |
|---|---|
| 膨胀 | 输出像素的值是输入像素所有相邻像素值的最大值。在二值图像中,如果任何相邻像素的值为1,则输出像素的值设置为1 |
| 腐蚀 | 输出像素的值是输入像素所有相邻像素值的最小值。在二值图像中,如果任何相邻像素的值为0,则输出像素的值设置为0 |
图3-1演示了二值图像的膨胀。要注意结构元素是如何定义目标像素(用圆圈圈起来的像素)的邻域的。膨胀函数对相邻像素采用了合适的规则,并且给输出图像中的对应像素指定了一个值。在图中,数学形态学函数将输出像素的值设置为1,因为结构元素所定义的邻域内有一个像素的值是1。
图3-1 二值图像的数学形态学——膨胀
图3-2演示了灰度图像的处理。该图显示了输入图像中特定像素的处理过程。请注意函数是如何采用规则来确定输入像素的邻域并把邻域内所有像素的最高值作为输出图像中对应像素的值的。
图3-2 灰度图像的数学形态学——膨胀
结构元素
膨胀和腐蚀运算的核心内容就是结构元素。平面结构(或二维)元素由元素为0和1的矩阵组成,一般比进行处理的图像要小得多。结构元素的中心像素(即原点)可以确定目标像素。结构元素中包含1的像素定义结构元素的邻域。这些像素在进行膨胀和腐蚀时都要进行考虑。
(1)结构元素的原点
用下面的命令行可以获取任何大小和维数的结构元素的原点坐标。
origin=floor((size(nhood)+1)/2)
在上面的命令行中,nhood是用结构元素定义的邻域。图3-3显示了一个菱形的结构元素。
(2)创建结构元素
图像处理工具箱中的膨胀和腐蚀函数接受名为STREL的结构元素对象。可以用strel函数创建任何大小和形状的STREL结构元素对象。该函数还支持一些通用的形状,如直线、菱形、圆形和球形等。
图3-3 一个菱形的结构元素
创建一个平面的菱形结构元素。
>> 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
处理图像边缘的像素
数学形态学函数可以在输入图像中的目标像素上确定结构元素原点的位置。对于图像边缘上的像素,结构元素所定义的部分邻域可以扩展到图像边界以外。
为了处理边界像素,数学形态学函数给这些没有定义的像素指定了一个值,就好像这些函数已经用额外的行和列填补了图像。这些填补的像素会根据膨胀和腐蚀运算有所不同。表3-2中介绍了二值图像和灰度图像的膨胀和腐蚀规则。
表3-2 填补图像的规则
| 运 算 | 规 则 |
|---|---|
| 膨胀 | 图像边界外的像素值为所提供的数据类型的最小值。对于二值图像,假定这些像素的值为0。对于灰度图像及uint8型图像,最小值为0 |
| 腐蚀 | 图像边界外的像素值为所提供的数据类型的最大值。对于二值图像,假定这些像素的值为1。对于灰度图像及uint8型图像,最大值为255 |
膨胀图像
用imdilate函数可以绘制膨胀图像。imdilate函数接受下面两个主要变量:
要处理的输入图像(灰度图像、二值图像或压缩二值图像);
由strel函数返回的结构元素对象或定义结构元素邻域的二值矩阵。
imdilate函数还接受两个可选变量:PADOPT和PACKOPT。PADOPT变量影响输出图像的尺寸。PACKOPT变量把输入图像识别为压缩二值图像。
对一幅包含矩形对象的简单二值图像进行膨胀操作。
>> 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
为了扩展前景对象的各条边,本例使用了一个33的方形结构元素对象。
>> SE=strel('square',3)
SE =
Flat STREL object containing 3 neighbors.
Neighborhood:
1 1 1
1 1 1
1 1 1
为了膨胀图像,给imdilate函数传递图像BW和结构元素SE。请注意膨胀操作是如何在前景对象周围添加一圈1的。
>> 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
腐蚀图像
用imerode函数可以腐蚀图像。该函数接受两个主要的变量:
要处理的输入图像(灰度图像、二值图像或压缩二值图像);
由strel函数返回的结构元素对象或定义结构元素邻域的二值矩阵。
imerode函数还接受3个可选变量:PADOPT、PACKOPT和M。PADOPT变量影响输出图像的大小。PACKOPT变量把输入图像识别为压缩二值图像。如果图像是压缩二值图像,则M变量可确定原始图像中的行数。
腐蚀一幅二值图像Snow.bmp。
(1)把图像读入MATLAB工作空间中。
>> BW1=imread('Snow.bmp');
(2)创建一个结构元素。下面的代码创建一个对角形结构元素对象。
>> SE=strel('arbitrary',eye(5));
SE=
Flat STREL object containing 5 neighbors.
Neighborhood:
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
(3)调用imerode函数,把图像BW和结构元素SE作为输入参数。
>> BW2=imerode(BW1,SE);
>> imshow(BW1)
>> figure, imshow(BW2)
生成图3-4所示的图像,图3-4(a)和图3-4(b)分别为腐蚀前后的图像。注意,图3-4(b)中的输出图像中添加上了很多对角斜条纹,这是因为结构元素的形状就是这样的。
(a) (b)
图3-4 腐蚀前后的图像
用bwulterode函数进行最大程度的腐蚀。
>> originalBW=imread('circles.png');
>> imshow(originalBW)
>> ultimateErosion=bwulterode(originalBW);
>> figure, imshow(ultimateErosion)
生成图3-5所示的图像,图3-5(a)和图3-5(b)分别为最大程度腐蚀前后的图像。
(a) (b)
图3-5 最大程度腐蚀前后的图像