snake图像分割
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机视觉实验二
——图像分割:snake轮廓模型
简介
Snake是Active Contour Model的一种,它以构成一定形状的一些控制点为模版(轮廓线),通过模版自身的弹性形变,与图像局部特征相匹配达到调和,即某种能量函数极小化,完成对图像的分割。每一个Snake都是能量最小曲线,受外部限制力引导及图像力的影响使它向着线和边缘等特征移动。Snakes是活动轮廓模型:他们自动跟踪附近边缘,准确地使曲线集中。尺度空间(scale-space)的连续性用来去扩大对特征周围区域的捕获。Snakes提供一种许多视觉问题的统一的解决方法,包括检测边,线及主观轮廓;移动跟踪;及立体匹配。我们成功使用Snakes用于交互解释(interactive interpretation),即用户提出一种限制力引导Snake靠近感兴趣的特征。
基本snake性能
我们的基本snake模型是一条被控制的连续曲线,其曲线受图像力和外部限制力的影响。内部样条(splint)力用来加以分段平滑限制。图像力把snake推向显著图像特征,如线,边,主观轮廓等等。外部限制力负责推动snakes靠近理想的局部最小值。例如这些力,可以来自使用者接口,自动注意机制(automatic attentional mechanisms),或者高层解释(high-level interpretations)。
实验关键步骤代码
1.获取手动取点坐标,该部分代码如下
14 % =========================================================================
15 %获取手动取点坐标
16 % =========================================================================
17 %读取显示图像
18 %I = imread('Coronary_MPR.jpg');
19 I = imread('plane.png');
20 %转化为双精度型
21 %I = im2double(I);
22 %若为彩色,转化为灰度
23 i f(size(I,3)==3), I=rgb2gray(I); end
24 f igure(1),imshow(I);
25 %---------------------------
26 %高斯滤波
27 %---------------------------
28 s igma=1;
29 %创建特定形式的二维高斯滤波器H
30 H = fspecial('gaussian',ceil(3*sigma), sigma);
31 %对图像进行高斯滤波,返回和I等大小矩阵
32 I gs = filter2(H,I,'same');
33 %---------------------------
34 %获取Snake的点坐标
35 %---------------------------
36 f igure(2),imshow(Igs);
37 x=[];y=[];c=1;N=100; %定义取点个数c,上限N
38 %获取User手动取点的坐标
39 % [x,y]=getpts
40 w hile c 41 [xi,yi,button]=ginput(1); 42 % 获取坐标向量 43 x=[x xi]; 44 y=[y yi]; 45 hold on 46 % text(xi,yi,'o','FontSize',10,'Color','red'); 47 plot(xi,yi,'ro'); 48 % 若为右击,则停止循环 49 if(button==3), break; end 50 c=c+1; 51 e nd 52 53 %将第一个点复制到矩阵最后,构成Snake环 54 x y = [x;y]; 55 c=c+1; 56 x y(:,c)=xy(:,1); 57 %样条曲线差值 58 t=1:c; 59 t s = 1:0.1:c; 60 x ys = spline(t,xy,ts); 61 x s = xys(1,:); 62 y s = xys(2,:); 63 %样条差值效果 64 h old on 65 t emp=plot(x(1),y(1),'ro',xs,ys,'b.'); 66 l egend(temp,'原点','插值点'); 2.Snake算法实现部分,代码如下: 68 % ========================================================================= 69 % Snakes算法实现部分 70 % ========================================================================= 71 N Iter =1000; % 迭代次数 72 a lpha=0.2; beta=0.2; gamma = 1; kappa = 0.1; 73 w l = 0; we=0.4; wt=0; 74 [row col] = size(Igs); 75 76 %图像力-线函数 77 E line = Igs; 78 %图像力-边函数 79 [gx,gy]=gradient(Igs); 80 E edge = -1*sqrt((gx.*gx+gy.*gy)); 81 %图像力-终点函数 82 %卷积是为了求解偏导数,而离散点的偏导即差分求解 83 m1 = [-11]; 84 m2 = [-1;1]; 85 m3 = [1 -21]; 86 m4 = [1;-2;1]; 87 m5 = [1 -1;-11]; 88 c x = conv2(Igs,m1,'same'); 89 c y = conv2(Igs,m2,'same'); 90 c xx = conv2(Igs,m3,'same'); 91 c yy = conv2(Igs,m4,'same'); 92 c xy = conv2(Igs,m5,'same'); 93 94 f or i = 1:row 95 for j= 1:col 96 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); 97 end 98 e nd 99 100 %figure(3),imshow(Eterm); 101 %figure(4),imshow(abs(Eedge)); 102 %外部力 Eext = Eimage + Econ 103 E ext = wl*Eline + we*Eedge + wt*Eterm; 104 %计算梯度 105 [fx,fy]=gradient(Eext); 106 107 x s=xs'; 108 y s=ys'; 109 [m n] = size(xs); 110 [mm nn] = size(fx); 111 112 %计算五对角状矩阵