资源描述:
《基于水平集的gac模型的图像分割报告.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、偏微分方程与图像处理(GAC的水平集方法)实验二GAC的水平集方法一实验目的采用GAC模型的水平集方法检测图像中对象的轮廓,以便有效地进行分割。二原理分析推广GAC模型的水平集方法对应的PDE为:(3.31)按照上式,曲线运动将受两种“力”的支配,第一种力来自于曲率几何形变—曲率运动(),不过它的强弱还要受到因子的影响。为图象I(x,y)的梯度模值,函数g(r)是可以是任何具有单调减性的函数。因为图象梯度模值在图象的边缘附近有较大值,从而使g()取极小的值,故在图象边缘附近,该作用力将会变的很小,因此有时将边缘函数称之为边缘停止函数。常数c的
2、作用是加速曲线向内部收缩。第二种力来自于g的梯度,它是一种不论当前C的局部是在对象内部或外部,都能将曲线引向边界的“吸引力”。从而总是使曲线向着更接近于边界线的方向运动,最终达到贴近对象边界的稳定状态。由于这两种作用使曲线演化可最终达到紧靠轮廓这一稳定状态而不再继续演化。采用单边迎风方案,根据(1.76)式的数值方案实现上式:考虑到,可得:(2.1)其中(2.3)中心差分(2.2)向前单边差分(2.3)向后单边差分(2.4)三编程过程1准备工作1)读入图像I,将其转化为灰度图象,重新调整图象的大小为[100,100]。2)进行预平滑,即对图象
3、进行高斯卷积滤波。3)计算图像梯度模值,,代入函数计算,然后计算g的梯度。4)选取初始封闭曲线,使其从外部全部包住对象,简单起见这里将选取为以图像中心为圆心的封闭圆。5)根据初始化水平集。2迭代运算1)根据(2.1)式进行迭代运算,由计算。2)每迭代5次,进行一次重新初始化,以免累计误差。具体的方法是根据当前演化得到的检测零水平集则为当前,根据当前重新初始化水平集。3)每10次观察一次零水平集,当演化曲线迭代400次,则停止迭代。3参数取值:c=34,=0.050.1,N=35,k=12.四程序1、主程序:%用GAC水平集演化方法检测图像轮廓
4、closeall;clearall;a=imread('3.bmp');%figure;imshow(a);a=rgb2gray(a);im=imresize(a,[100100]);%figure;imshow(im);imsize=size(im);im_1=double(im);%对图像进行高斯滤波sigma=2;gauss_filter=fspecial('gaussian',3,sigma);%默认值3*3,SIGMA=0.5b=imfilter(im_1,gauss_filter,'conv');%计算图像梯度[Ix,Iy]和梯度
5、模值deltI[Ix,Iy]=gradient(b);deltI=abs(sqrt(Ix.^2+Iy.^2));k=2;g=exp(-deltI./k);[gx,gy]=gradient(g);%初始化圆,定义中心和半径center=[floor(size(im)/2)];radius=min(center)-8;u=init_u(imsize,center,radius);%调用迭代函数filename='3.bmp';m_name=filename(1:strfind(filename,'.')-1);num=400;u_new=die_
6、dai(im,u,g,num,m_name);2、主要子程序(1)初始化水平集函数:functionu=init_u(imsize,center,radius)%初始化水平集m=imsize(1);n=imsize(2);u=zeros(imsize);fori=1:m;forj=1:n;distance=sqrt(sum((center-[i,j]).^2));u(i,j)=distance-radius;endend(2)迭代计算函数:functionu=die_dai(im,u,g,num,m_name)[m,n]=size(u);[g
7、x,gy]=gradient(g);u1=u;newpic=im;fori=2:m-1forj=2:n-1if(u(i,j)*u(i+1,j)<0)
8、(u(i,j)*u(i,j+1)<0)==1newpic(i,j)=0;endendendfigure;imshow(newpic);[gx,gy]=gradient(g);det=0.05;c=3;dx=1;dy=1;display_it=10;fork=1:numifmod(k,5)==0u=re_init_u(u);end%x和y方向的前向差分和后向差分diff_x_backward=(u
9、-circshift(u,[0,1]));diff_x_forward=(circshift(u,[0,-1])-u);diff_y_backward=(u-cir