一、Snake模型[3]的數字原理
來自[1]
1987年Kass等人共同發表了題爲“Snake:Active contour models”的論文,首次引進了變分法,提出了運用活動輪廓模型進行圖像分割的思想.
二、原理解釋
來自[2]
Snake模型首先需要在感興趣區域的附近給出一條初始曲線,接下來最小化能量泛函,讓曲線在圖像中發生變形並不斷逼近目標輪廓。
Kass等提出的原始Snakes模型由一組控制點:v(s)=[x(s), y(s)] s∈[0, 1] 組成,這些點首尾以直線相連構成輪廓線。其中x(s)和y(s)分別表示每個控制點在圖像中的座標位置。 s 是以傅立葉變換形式描述邊界的自變量。在Snakes的控制點上定義能量函數(反映能量與輪廓之間的關係):
其中第1項稱爲彈性能量是v的一階導數的模,第2項稱爲彎曲能量,是v的二階導數的模,第3項是外部能量(外部力),在基本Snakes模型中一般只取控制點或連線所在位置的圖像局部特徵例如梯度:
也稱圖像力。(當輪廓C靠近目標圖像邊緣,那麼C的灰度的梯度將會增大,那麼上式的能量最小,由曲線演變公式知道該點的速度將變爲0,也就是停止運動了。這樣,C就停在圖像的邊緣位置了,也就完成了分割。那麼這個的前提就是目標在圖像中的邊緣比較明顯了,否則很容易就越過邊緣了。)
彈性能量和彎曲能量合稱內部能量(內部力),用於控制輪廓線的彈性形變,起到保持輪廓連續性和平滑性的作用。而第三項代表外部能量,也被稱爲圖像能量,表示變形曲線與圖像局部特徵吻合的情況。內部能量僅僅跟snake的形狀有關,而跟圖像數據無關。而外部能量僅僅跟圖像數據有關。在某一點的α和β的值決定曲線可以在這一點伸展和彎曲的程度。
最終對圖像的分割轉化爲求解能量函數Etotal(v)極小化(最小化輪廓的能量)。在能量函數極小化過程中,彈性能量迅速把輪廓線壓縮成一個光滑的圓,彎曲能量驅使輪廓線成爲光滑曲線或直線,而圖像力則使輪廓線向圖像的高梯度位置靠攏。基本Snakes模型就是在這3個力的聯合作用下工作的。
因爲圖像上的點都是離散的,所以我們用來優化能量函數的算法都必須在離散域裏定義。所以求解能量函數Etotal(v)極小化是一個典型的變分問題(微分運算中,自變量一般是座標等變量,因變量是函數;變分運算中,自變量是函數,因變量是函數的函數,即數學上所謂的泛函。對泛函求極值的問題,數學上稱之爲變分法)。
在離散化條件(數字圖像)下,由歐拉方程可知最終問題的答案等價於求解一組差分方程:(歐拉方程是泛函極值條件的微分表達式,求解泛函的歐拉方程,即可得到使泛函取極值的駐函數,將變分問題轉化爲微分問題。)
記外部力 F = −∇ P, Kass等將上式離散化後,對x(s)和y(s)分別構造兩個五對角陣的線性方程組,通過迭代計算進行求解。在實際應用中一般先在物體周圍手動點出控制點作爲Snakes模型的起始位置,然後對能量函數迭代求解。
三、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');
I = imread('t2.bmp');
% 轉化爲雙精度型
%I = im2double(I);
% 若爲彩色,轉化爲灰度
if(size(I,3)==3), I=rgb2gray(I); end
figure(1),imshow(I);
%---------------------------
% 高斯濾波
%---------------------------
sigma=1.0;
% 創建特定形式的二維高斯濾波器H
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<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 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 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);
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 + 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
四、演示效果
五、不足
Kass 等提出的基本 Snakes 模型,在沒有圖像力平衡的條件下,內部力將把所有控制點收縮爲一點或一條直線。也就是說,被分割物體必須完全包含在 Snakes 的初始位置之內,否則陷在內部的控制點將無法回到物體的邊界(下圖所示)
reference
1、http://www.doc88.com/p-6741785598618.html
2、《Matlab圖像處理》part1 Snakes:Active Contour Models 主動輪廓模型
3、M. Kass, A. Witkin, and D. Terzopoulos. Snakes Active contour models. Int.