腐蚀和膨胀是数学形态学上的名词,如果用于图像处理上则就称为图像二值形态学。
形态学主要是为了获取物体的拓扑和结构信息,通过物体和结构元素相互作用的某些运算,得到物体更本质的形态。当形态学运用到图像处理中,它的主要作用是利用形态学的基本运算,如腐蚀和膨胀运算,对图像进行观察和处理,从而达到改善图像质量的目地;描述和定义图像的各种几何参数和特征。
二值图像的腐蚀和膨胀操作具体如下:
腐蚀的具体操作:用一个结构元素(也可以说成操作数矩阵)一般为3×3大小的,也可以看成一个卷积模板它们的区别就在于卷积模板是以算术运算为基础的,而结构元素是以集合运算为基础的,扫描图像中的每一个像素(关于图像边缘的处理见下面详细分析),用操作数矩阵扫描图像中的每一个像素,操作数矩阵中每一个像素与覆盖的像素做“与”操作,如果全部为1,则图像中的该像素为1,反之为0,而膨胀操作正好相反,全部为0时,则图像素中的该像素为0,反之为1。
腐蚀的作用是消除物体的边界点,使目标缩小,这个根据操作的过程可以显然的想到,物体的边界处像素值肯定是有0和1,腐蚀操作后这些紧邻着为1的像素点都会变成0,所以腐蚀操作会消除那些小的且无意义的物体,使边界向内部收缩的过程。相反,膨胀的作用当然是使目标增大,填充物体内细小的空洞,并且平滑物体的边界,边界向外部扩张的作用。
开运算是先腐蚀后膨胀的过程,可以消除图像上细小的噪声,并平滑物体的边界
闭运算是先膨胀后腐蚀的过程,可以填充物体内细小的空洞,并平滑物体边界
通常,由于噪声的影响,图象在阈值化后所得到边界往往是很不平滑的,物体区域具有一些噪声孔,背景区域上散布着一些小的噪声物体。连续的开和闭运算可以有效地改善这种情况。有时需要经过多次腐蚀之后再加上相同次数的膨胀,才可以产生比较好的效果。
腐蚀操作会去掉物体的边缘点,细小物体所有的点都会被认为是边缘点,因此会整个被删去。再做膨胀时,留下来的大物体会变回原来的大小,而被删除的小物体则永远消失了。
膨胀操作会使物体的边界向外扩张,如果物体内部存在小空洞的话,经过膨胀操作这些洞将被补上,因而不再是边界了。再进行腐蚀操作时,外部边界将变回原来的样子,而这些内部空洞则永远消失了。
对上面腐蚀和膨胀操作更细致的分析(主要谈论涉及图像边缘的腐蚀和膨胀运算)
注:结构元素在扫描图像中的每个像素时,结构元素的邻域有部分会在图像外面。比如当结构元素扫描图像上方第一行像素值(这里默认结构元素为3×3),结构元素会有部分在图像的外面,此时,为了有效处理边界像素,进行形态学运算的函数通常都会给出超出图像、未指定数值的像素指定一个数值,这样就类似于函数给图像填充了额外的行和列。对于膨胀和腐蚀操作,它们对像素进行填充的值是不同的。规则如下:
腐蚀和膨胀填充图像规则表
|
规 则 |
腐蚀 | 超出图像边界的像素值定义为该数据类型允许的最大值,对于二进制图像,这些像素值设置为1;对于灰度图像,unit8类型的最小值也为255。 |
膨胀 | 超出图像边界的像素值定义为该数据类型允许的最小值,对于二进制图像,这些像素值设置为0;对于灰度图像,unit8类型的最小值也为0。 |
结构元素:膨胀和腐蚀操作的最基本组成部分,用于测试输出图像,通常要比待处理的图像小的多。二维平面结构元素由一个数值为0或1的矩阵组成。结构元素的原点指定了图像中需要处理的像素范围,结构元素中数值为1的点决定结构元素的邻域像素在进行膨胀或腐蚀操作时是否需要参与计算。三维或非平面的结构元素使用0,1定义结构元素在x和y平面上的范围,第三维z定义高度。
关于图像腐蚀和膨胀的实现:
matlab和openCV都可以实现
matlab语言中自带了关于腐蚀和膨胀的函数,如果想要看实现效果,则可以直接调用,imerode(输入图像,结构元素)和imdilate(输入图像,结构元素),结构元素对象可以是strel函数返回的对象,也可以是一个自己定义的表示结构元素邻域的二进制矩阵。
因为没做实验,所以在此不再粘贴代码和实验结果,以上(其中有借鉴部分)如果有错误请大家批评指正哈!
Matlab函数
1. 腐蚀函数:erode()
如:I1=erode(I,SE);
2. 膨胀函数:dilate()
如:I2=dilate(I,SE);
3. 开运算函数:imopen()
如:I3=imopen(I,SE);
4. 闭运算函数:imclose()
如:I4=imclose(I,SE);
说明:I 为待处理图像,SE为结构元素。
5. 结构元素SE的构建函数:strel
如:SE=strel(shape,parameters);
创建由指定形状shape对应的结构元素。其中shape的种类有:'arbitrary'///'pair'/'periodicline'/'diamond'/'disk'/'rectangle'/'line'/'square'/'octagon'/'ball'
其中:对、周期线、钻石体、圆盘、矩形、直线、正方形、八角形、椭球体
参数parameters一般控制se的大小。
SE= strel('arbitrary',NHOOD)
创建一个指定领域的平面结构化元素。NHOOD是一个包含1或0的矩阵;1的位置定义了领域的形态学操作。NHOOD的中心就是它的中心元素,位置在floor((size(NHOOD) + 1)/2)。你也可以忽略参数串'arbitrary'而只使用strel(NHOOD)。
SE= strel('arbitrary',NHOOD,HEIGHT)
创建一个指定领域的非平面结构化元素。HEIGHT是一个矩阵,大小和NHOOD相同,他指定了NHOOD中任何非零元素的高度值。HEIGHT必须是实有限值。你也可以忽略参数串'arbitrary'而只使用strel(NHOOD,HEIGHT)。
SE= strel('ball',R,H,N)
创建一个空间椭球状的结构元素,其X-Y平面半径为R,高度为H。R必须为非负整数,H是一个实数。N必须为一个非负偶数,当N>0时此球形结构元素由一系列空间线段结构元素来近似;当N=0时不需要近似,结构化元素的成员由所有中心距圆点>R的元素组成,相应的高度值可由R/H指定的椭球中提取。如果N未指定,缺省值8,并且。注: 使用球体近似的形态学操作N>0的情况要比N=0的情况快许多。
SE = strel('diamond',R)
创建一个指定大小R平面钻石形状的结构化元素。R是从结构化元素原点到其点的距离,必须为非负整数。
SE = strel('disk',R,N)
创建一个指定半径R的平面圆盘形的结构元素。这里R必须是非负整数. N须是0, 4, 6, 8.当N大于0时,圆盘形结构元素由一组N(或N+2)个周期线结构元素来近似。当N等于0时,不使用近似,即结构元素的所有像素是由到中心像素距离小于等于R的像素组成。N可以被忽略,此时缺省值是4。注: 形态学操作在N>0情况下要快于N=0的情形。
SE = strel('line', LEN, DEG)
创建一个平面线性的结构元素。其中LEN指定其线路长度,DEG指定其线路角度,从水平轴按逆时针方向计算,LEN是在线路两端的结构元素的成员中心之间的距离。
SE = strel('octagon', R)
创建一个平面八角形的结构元素。R是从结构元素的原点,从八角形的两侧,沿水平和垂直轴测量所得的距离。 R必须是一个非负的且是3的倍数。
SE = strel('pair', OFFSET)
创建一个平面包含二个成员的结构元素。一个成员位于原点,另一个成员的位置由矢量OFFSET决定。OFFSET必须是包含两个元素的整数矢量。
SE = strel('periodicline', P, V)
创建一个平面包含2*P+1个成员的结构元素。V是包含行和列偏移值大小的整形矢量。其中一个结构元素成员位于原点。其他成员分别位于V,-V,2 V,-2V,...,PV,-PV。
SE = strel('rectangle', MN)
创建一个平面矩形的结构元素,其中MN指定其大小。 MN必须是一个包含两个元素的非负整数矢量。MN的第一个元素是结构元素邻域的行的数量,第二个元素则是列的数量。
SE = strel('square', W)
创建一个正方形结构元素。其宽度为W,W必须是一个非负整数的标量。