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

来源:互联网 发布:空铁列车 知乎 编辑:程序博客网 时间:2024/05/08 03:05
% =========================================================================%                   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');I =  imread('test1.png');% 转化为双精度型%I = im2double(I); % 若为彩色,转化为灰度%if(size(I,3)==3), I=rgb2gray(I); endfigure(1),imshow(I);%---------------------------%        高斯滤波%---------------------------sigma=1;% 创建特定形式的二维高斯滤波器HH = 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]=getptswhile c<N    [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 ontemp=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 i = 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);    endend%figure(3),imshow(Eterm);%figure(4),imshow(abs(Eedge));% 外部力 Eext = Eimage + EconEext = 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 + 6 *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



5 1
原创粉丝点击