加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

转载 数字图像处理-图像分割:Snake主动轮廓模型 Matlab代码及运行结果

(2017-11-25 20:34:38)
标签:

365

【转载】

 

 

数字图像处理-图像分割:Snake主动轮廓模型 Matlab代码及运行结果

 


  • =========================================================================  
  •                   Snakes:Active Contour Models  
  • =========================================================================  
  • By gujinjin 2012/12/10-12  Sunny  
  • 基于KASS等的论文思想  
  • 参考文献:  
  • [1] KASS etc.Snakes:Active Contour Models  
  • [2] CSDN 博客 Author:乐不思蜀Tone  
  • [3] Ritwik Kumar(Harvard University),D.Kroon(Twente University)的程序  
  • [4] 《数学建模与数学实验》  
  • ------  
  • clc;clf;clear all;  
  •   
  • =========================================================================  
  •                      获取手动取点坐标  
  • =========================================================================  
  • 读取显示图像  
  • %I imread('Coronary_MPR.jpg');  
  •  imread('test1.png');  
  • 转化为双精度型  
  • %I im2double(I);   
  • 若为彩色,转化为灰度  
  • %if(size(I,3)==3), I=rgb2gray(I); end  
  • figure(1),imshow(I);  
  • %---------------------------  
  •        高斯滤波  
  • %---------------------------  
  • sigma=1;  
  • 创建特定形式的二维高斯滤波器H  
  • fspecial('gaussian',ceil(3*sigma), sigma);  
  • 对图像进行高斯滤波,返回和I等大小矩阵  
  • Igs filter2(H,I,'same');  
  • %---------------------------  
  •      获取Snake的点坐标  
  • %---------------------------  
  • figure(2),imshow(Igs);  
  • x=[];y=[];c=1;N=100; %定义取点个数c,上限N  
  • 获取User手动取点的坐标  
  • [x,y]=getpts  
  • while c
  •     [xi,yi,button]=ginput(1);  
  •     获取坐标向量  
  •     x=[x xi];  
  •     y=[y yi];  
  •     hold on  
  •     text(xi,yi,'o','FontSize',10,'Color','red');  
  •     plot(xi,yi,'ro');  
  •     若为右击,则停止循环  
  •     if(button==3), break; end  
  •     c=c+1;  
  • end  
  •   
  • 将第一个点复制到矩阵最后,构成Snake环  
  • xy [x;y];  
  • c=c+1;  
  • xy(:,c)=xy(:,1);  
  • 样条曲线差值  
  • t=1:c;  
  • ts 1:0.1:c;  
  • xys spline(t,xy,ts);  
  • xs xys(1,:);  
  • ys xys(2,:);  
  • 样条差值效果  
  • hold on  
  • temp=plot(x(1),y(1),'ro',xs,ys,'b.');  
  • legend(temp,'原点','插值点');  
  •   
  • =========================================================================  
  •                     Snakes算法实现部分  
  • =========================================================================  
  • NIter =1000; 迭代次数  
  • alpha=0.2; beta=0.2; gamma 1; kappa 0.1;  
  • wl 0; we=0.4; wt=0;  
  • [row col] size(Igs);  
  •   
  • 图像力-线函数  
  • Eline Igs;  
  • 图像力-边函数  
  • [gx,gy]=gradient(Igs);  
  • Eedge -1*sqrt((gx.*gx+gy.*gy));  
  • 图像力-终点函数  
  • 卷积是为了求解偏导数,而离散点的偏导即差分求解  
  • m1 [-1 1];   
  • m2 [-1;1];  
  • m3 [1 -2 1];   
  • m4 [1;-2;1];  
  • m5 [1 -1;-1 1];  
  • cx conv2(Igs,m1,'same');  
  • cy conv2(Igs,m2,'same');  
  • cxx conv2(Igs,m3,'same');  
  • cyy conv2(Igs,m4,'same');  
  • cxy conv2(Igs,m5,'same');  
  •   
  • for 1:row  
  •     for j= 1:col  
  •         Eterm(i,j) (cyy(i,j)*cx(i,j)*cx(i,j) -2 *cxy(i,j)*cx(i,j)*cy(i,j) cxx(i,j)*cy(i,j)*cy(i,j))/((1+cx(i,j)*cx(i,j) cy(i,j)*cy(i,j))^1.5);  
  •     end  
  • end  
  •   
  • %figure(3),imshow(Eterm);  
  • %figure(4),imshow(abs(Eedge));  
  • 外部力 Eext Eimage Econ  
  • Eext wl*Eline we*Eedge wt*Eterm;  
  • 计算梯度  
  • [fx,fy]=gradient(Eext);  
  •   
  • xs=xs';  
  • ys=ys';  
  • [m n] size(xs);  
  • [mm nn] size(fx);  
  •   
  • 计算五对角状矩阵  
  • 附录: 公式(14) b(i)表示vi系数(i=i-2 到 i+2)  
  • b(1)=beta;  
  • b(2)=-(alpha 4*beta);  
  • b(3)=(2*alpha *beta);  
  • b(4)=b(2);  
  • b(5)=b(1);  
  •   
  • A=b(1)*circshift(eye(m),2);  
  • A=A+b(2)*circshift(eye(m),1);  
  • A=A+b(3)*circshift(eye(m),0);  
  • A=A+b(4)*circshift(eye(m),-1);  
  • A=A+b(5)*circshift(eye(m),-2);  
  •   
  • 计算矩阵的逆  
  • [L U] lu(A gamma.* eye(m));  
  • Ainv inv(U) inv(L);   
  •   
  • =========================================================================  
  •                      画图部分  
  • =========================================================================  
  • %text(10,10,'+','FontName','Time','FontSize',20,'Color','red');  
  • 迭代计算  
  • figure(3)  
  • for i=1:NIter;  
  •     ssx gamma*xs kappa*interp2(fx,xs,ys);  
  •     ssy gamma*ys kappa*interp2(fy,xs,ys);  
  •    
  •     计算snake的新位置  
  •     xs Ainv ssx;  
  •     ys Ainv ssy;  
  •       
  •     显示snake的新位置  
  •     imshow(I);   
  •     hold on;  
  •     plot([xs; xs(1)], [ys; ys(1)], 'r-');  
  •     hold off;  
  •     pause(0.001)      
  • end  

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有