snake图像分割

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 %计算五对角状矩阵

相关文档
最新文档