基於偏微分方程的圖像分割 Snake模型 Matlab實現

一、Snake模型[3]的數字原理

來自[1]

1987年Kass等人共同發表了題爲“Snake:Active contour models”的論文,首次引進了變分法,提出了運用活動輪廓模型進行圖像分割的思想.

v2-1d1a82c4cddede8c9961590d45266bfb_b.jpg

v2-63a0e16d4d0047e99f9663b0cd6a305f_b.jpg

v2-064eb7329a3044f9b70f26303f36ed5d_b.jpg

二、原理解釋

來自[2]

Snake模型首先需要在感興趣區域的附近給出一條初始曲線,接下來最小化能量泛函,讓曲線在圖像中發生變形並不斷逼近目標輪廓。

Kass等提出的原始Snakes模型由一組控制點:v(s)=[x(s), y(s)] s∈[0, 1] 組成,這些點首尾以直線相連構成輪廓線。其中x(s)和y(s)分別表示每個控制點在圖像中的座標位置。 s 是以傅立葉變換形式描述邊界的自變量。在Snakes的控制點上定義能量函數(反映能量與輪廓之間的關係):

v2-70ccd116f58cadee150cb358d56f346b_b.jpg

其中第1項稱爲彈性能量是v的一階導數的模,第2項稱爲彎曲能量,是v的二階導數的模,第3項是外部能量(外部力),在基本Snakes模型中一般只取控制點或連線所在位置的圖像局部特徵例如梯度:

v2-4a9494ba55b4c82c48a3a4d5399466a2_b.png

也稱圖像力。(當輪廓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 的初始位置之內,否則陷在內部的控制點將無法回到物體的邊界(下圖所示)

v2-35e3aceaae1a3742d6d17275face485e_b.jpg

reference

1、doc88.com/p-67417855986

2、《Matlab圖像處理》part1 Snakes:Active Contour Models 主動輪廓模型

3、M. Kass, A. Witkin, and D. Terzopoulos. Snakes Active contour models. Int.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章