图像的腐蚀(erode)和膨胀(dilate)开运算以及闭运算------
理论知识及其对应函数
腐蚀和膨胀是数学形态学上的名词,如果⽤于图像处理上则就称为图像⼆值形态学。
形态学主要是为了获取物体的拓扑和结构信息,通过物体和结构元素相互作⽤的某些运算,得到物体更本质的形态。当形态学运⽤到图像处理中,它的主要作⽤是利⽤形态学的基本运算,如腐蚀和膨胀运算,对图像进⾏观察和处理,从⽽达到改善图像质量的⽬地;描述和定义图像的各种⼏何参数和特征。
⼆值图像的腐蚀和膨胀操作具体如下:
腐蚀的具体操作:⽤⼀个结构元素(也可以说成操作数矩阵)⼀般为3×3⼤⼩的,也可以看成⼀个卷积模板它们的区别就在于卷积模板是以算术运算为基础的,⽽结构元素是以集合运算为基础的,扫描图像中的每⼀个像素(关于图像边缘的处理见下⾯详细分析),⽤操作数矩阵扫描图像中的每⼀个像素,操作数矩阵中每⼀个像素与覆盖的像素做“与”操作,如果全部为1,则图像中的该像素为1,反之为0,⽽膨胀操作正好相反,全部为0时,则图像素中的该像素为0,反之为1。
腐蚀的作⽤是消除物体的边界点,使⽬标缩⼩,这个根据操作的过程可以显然的想到,物体的边界处像素值肯定是有0和1,腐蚀操作后这些紧邻着为1的像素点都会变成0,所以腐蚀操作会消除那些⼩的且⽆
意义的物体,使边界向内部收缩的过程。相反,膨胀的作⽤当然是使⽬标增⼤,填充物体内细⼩的空洞,并且平滑物体的边界,边界向外部扩张的作⽤。
开运算是先腐蚀后膨胀的过程,可以消除图像上细⼩的噪声,并平滑物体的边界
闭运算是先膨胀后腐蚀的过程,可以填充物体内细⼩的空洞,并平滑物体边界
通常,由于噪声的影响,图象在阈值化后所得到边界往往是很不平滑的,物体区域具有⼀些噪声孔,背景区域上散布着⼀些⼩的噪声物体。连续的开和闭运算可以有效地改善这种情况。有时需要经过多次腐蚀之后再加上相同次数的膨胀,才可以产⽣⽐较好的效果。
腐蚀操作会去掉物体的边缘点,细⼩物体所有的点都会被认为是边缘点,因此会整个被删去。再做膨胀时,留下来的⼤物体会变回原来的⼤⼩,⽽被删除的⼩物体则永远消失了。
膨胀操作会使物体的边界向外扩张,如果物体内部存在⼩空洞的话,经过膨胀操作这些洞将被补上,因⽽不再是边界了。再进⾏腐蚀操作时,外部边界将变回原来的样⼦,⽽这些内部空洞则永远消失了。
对上⾯腐蚀和膨胀操作更细致的分析(主要谈论涉及图像边缘的腐蚀和膨胀运算)
注:结构元素在扫描图像中的每个像素时,结构元素的邻域有部分会在图像外⾯。⽐如当结构元素扫描图像上⽅第⼀⾏像素值(这⾥默认结构元素为3×3),结构元素会有部分在图像的外⾯,此时,为了有效处理边界像素,进⾏形态学运算的函数通常都会给出超出图像、未指定数值的像素指定⼀个数值,这样就类似于函数给图像填充了额外的⾏和列。对于膨胀和腐蚀操作,它们对像素进⾏填充的值是不同的。规则如下:
腐蚀和膨胀填充图像规则表
规则
腐蚀超出图像边界的像素值定义为该数据类型允许的最⼤值,对于⼆进制图像,这些像素值设置为1;对于灰度图像,unit8类型的最⼩值也为255。
膨胀超出图像边界的像素值定义为该数据类型允许的最⼩值,对于⼆进制图像,这些像素值设置为0;对于灰度图像,unit8类型的最⼩值也为0。
通过对膨胀操作使⽤最⼩值填充和对腐蚀操作使⽤最⼤值填充,可以有效地消除边界效应(输出图像靠近边界处的区域与图像其它部分不连续)。否则,如果腐蚀操作使⽤最⼩值进⾏填充,则进⾏腐蚀操作后,输出图像会围绕着⼀个⿊⾊边框。(此处根据腐蚀和膨胀的具体操作过程应该不难理解,因为
当图像边缘都是⽩⾊时也就是像素值全为1,此时如果图像边缘外⾯的像素值填充为最⼩值,如果⼆值图像的话则像素值为0,根据腐蚀操作,相与后肯定为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是在线路两端的结构元素的成员中⼼之间的距离。
rectangle函数opencvSE = 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必须是⼀个⾮负整数的标量。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论