更多MATLAB图像处理视频请点击 http://study.163.com/course/courseMain.htm?courseId=1003594013
数学形态学的数学基础是集合论,因此数学形态学有完备的数学基础,这位数学形态学用于图像分析和处理奠定了坚实的基础。数学形态学运算是由一组形态学的代数运算子组成,其基本思想是用具有一定形态的结构元素找到图像中的对应形状以达到图像分割识别的目的,基本的操作有膨胀、腐蚀、开启和关闭。基于这些基本操作可以推到出数学形态学的很多实用算法,从而进行进一步的图像处理。将数学形态学应用于图像处理可以简化图像数据,保持他们的基本形状。
目前形态学的应用几乎覆盖了图像处理的所有领域,包括医学图像处理、文字识别、图像编码压缩、材料科学、视觉检测以及计算机视觉等。
本章主要讲述MATLAB图像处理工具箱中的形态学操作函数。可以使用这些函数进行一般的图像处理任务。
1.腐蚀和膨胀
腐蚀和膨胀是数学形态学的基本操作,数学形态学的很多操作都是以膨胀和腐蚀为基础推导的算法。
1.1.理解膨胀和腐蚀
膨胀是指将像素加到图像中对象的边缘,而腐蚀是指删除图像中对像的边缘。增加或者删除的像素数目依赖于处理过程中使用的结构元素的大小和形状。而膨胀和腐蚀的形态学操作中,输出像素的任何状态都是输入图像中相应像素与领域像素执行膨胀或者腐蚀运算得到的。
膨胀和腐蚀的规则:
运算 规则
膨胀 输出像素的值是所有输入像素值中的最大值。在二值图像中,如果领域中有一个像素值为1,则输出像素值为1
腐蚀 输出像素的值是所有输入像素值中的最小值,在二值图像中,若果领域中有一个像素值为0,则输出像素值为0
下图说明了二值图像的腐蚀操作,注意,结构元素定义了感兴趣像素的领域。膨胀函数对领域中的像素应用了相应的规则,在输出图像中返回相应的像素值,在这幅图中,形态学膨胀函数把输出像素的值设为1,因为结构元素定义的领域中有像素值为1.
下面的图中说明了灰度图像的膨胀操作,该图说明了输入图像中特定像素的处理过程。注意,膨胀操作吧输入图像中结构元素定义的领域中最大的像素值作为输出像素值。
1.2 处理图像边界的像素
形态学操作函数把结构元素的中心对应输入图像指定的像素值,对于图像便界上的元素,结构元素定义的部分领域可以扩展到图像的便界以外。
为了处理图像边界的像素,形态学函数会给这些没有定义的像素指定一个值,就好像是函数已经用额外的行和列填充了图像一样,这些填充的像素值会因为膨胀或者腐蚀有所不同,下表列出了对于二值图像和灰度图像的膨胀和腐蚀的填充规则。
运算 规则
膨胀 图像边界外的像素值被指定为图像数据类型的最小值,对于二值图像,这些值设定为0,对于uint8类型的灰度图,这些值设定为0
腐蚀 图像边界外的像素值被指定为图像数据类型的最大值,对于二值图像,这些值设定为1,对于uint8类型的灰度图像,这些值设定为255
通过在膨胀操作中使用最小值,在腐蚀操作中使用最大值,在图像处理中避免了边界效应。边界效应是指输出图像中边界元素的值的分布不像图像中的其他部分那样均一。
例如,如果腐蚀操作中使用最小值填充边界,腐蚀图像将会在图像边界产生一个黑色的边框,因为这些边界的像素值为0,这就就是所谓的边界效应。
1.3 理解结构元素
膨胀和腐蚀操作的核心内容是结构元素。一般来说结构元素是由元素为1或者0的矩阵组成。结构元素为1的区域定义了图像的领域,领域内的像素在进行膨胀和腐蚀等形态学操作时要进行考虑。
一般来说,二维或者平面结构的结构元素要比处理的图像小得多。结构元素的中心像素,即结构元素的原点,与输入图像中感兴趣的像素值(即要处理的像素值)相对应。
三维的结构元素使用0和1来定义x-y平面中结构元素的范围,使用高度值定义第三维。
(1)结构元素的原点
形态学操作中使用下面的公式来得到任意形状和维数的结构元素的原点坐标:
origin=floor((size(nhood)+1)/2)
其中,nhood是定义的结构元素的邻域。
例:
(2)创建结构元素
MATLAB图像处理工具箱中的strel函数可以生成任意维数和形状的结构元素,strel函数当然支持生成一般的形状,例如直线、菱形、圆盘、球形等的结构元素。
在图像处理中可以选用跟输入图像同样大小和形状的结构元素。例如为了发现图像中的直线,可以创建一个直线结构元素。
strel函数的常见调用方法如下:
se=strel('arbitrary',NHOOD):根据矩阵NHOOD创建一个平面结构元素,NHOOD中值为1的元素定义了结构元素的邻域
se=strel('arbitrary',NHOOD,HEIGHT):创建一个非平面的结构元素,其中,NHOOD规定了邻域,HEIGHT为与NHOOD同样大小的矩阵,其值为NHOOD中每个元素的高度值
se=strel('ball',R,H,N) :创建一个球形的结构元素,R为x-y平面上的半径,H为其高度,N为非负数
se=strel('diamond',R):创建一个菱形的结构元素,R为菱形的中心与其边界的最长距离
se=strel('disk',R,N): 创建一个圆盘的结构元素,R为圆盘的半径,N可以取值为:0,4,6,8,默认值为4
se=strel('line',LEN,DEG):创建一个线形的结构元素,LEN为长度,DEG为角度
se=strel('octagon',R):创建一个八边形的结构元素,其中R为八边形的中心到八边形边缘的最大距离,必须为3的倍数
se=strel('pair',OFFSET):创建一个成对的结构元素,其中一个元素在原点,另一个元素又OFFSET来决定,OFFSET为二维结构的数组
se=strel('periodicline',P,V):创建一个周期出现的结构元素。其中2*P+1为结构元素的周期数,V规定了两个周期之间的偏移
se=strel('rectangle',MN):创建一个矩形的结构元素,其中MN为二维数组,规定了矩形的行数和列数
se=strel('square',W):创建一个方形的结构元素,其中W为方形结构的宽度
例 :创建一个菱形的结构元素
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
我们可以看到数值为1的矩阵构成了一个菱形。
(3)结构元素分解
为了增强行数的性能,strel函数经常把结构元素分解成小块,这种技术称为结构元素的分解。例如,使用以11x11的结构元素对目标进行膨胀,等同于先使用一个1x11的结构元素进行膨胀,然后使用11x1的结构元素进行膨胀。这个方法理论上会使膨胀操作的速度提高5.5倍,但实际上速度提高没有那么多。
对于‘disk’或者‘ball’形状的结构元素,结构元素分解的结果是近似的,对于其他形状的结构元素分解的结果是精确的。只有结构元素的领域都是1组成的平面结构时,可以用于任意元素的分解。
使用getsequence函数可以查询到结构元素分解后的序列。该函数返回一个结构元素数组,每个元素为分解后的结构元素,它的常见调用方法如下:
seq=getsequence(se)
其中:
se是指要分解的结构元素
seq是分解后返回的结构元素。
例:将菱形结构元素分解,并创建新的结构元素
se=strel('diamond',4)
se =
Flat STREL object containing 41 neighbors.
Decomposition: 3 STREL objects containing a total of 13 neighbors
Neighborhood:
0 0 0 0 1 0 0 0 0
0 0 0 1 1 1 0 0 0
0 0 1 1 1 1 1 0 0
0 1 1 1 1 1 1 1 0
1 1 1 1 1 1 1 1 1
0 1 1 1 1 1 1 1 0
0 0 1 1 1 1 1 0 0
0 0 0 1 1 1 0 0 0
0 0 0 0 1 0 0 0 0
>> seq=getsequence(se)
seq =
3x1 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
从结果可以看出这个菱形结构被分解成了三个比较小的结构元素
1.4 图像膨胀
对图像进行膨胀可以使用MATLAB图像处理工具箱中的imdilate函数,imdilate函数主要接收两个输入参数,一个是要处理的图像(灰度图像或者二值图像),另外一个是strel函数返回的结构元素对象,或者是定义了结构元素邻域的二值矩阵。
imdilate函数的常见调用方法如下:
IM2=imdilate(IM,SE)
IM2=imdilate(IM,NHOOD)
IM2=imdilate(....,shape)
其中:
IM是输入的要处理的二值图像或者灰度图像
SE是strel函数返回的结构元素
NHOOD是一个元素值只有0或者1的矩阵,规定了结构元素的邻域
shape规定了输出图像的形状,有两种选择,一种为‘same’,即跟输入图像相同大小,一种为‘full’,是全膨胀后的结果
IM2是返回的膨胀后的图像
例:对一个含有矩形块的图像进行了膨胀操作
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