Matlab图像分割---使用主动轮廓 (snake) 方法进行图像分割
實例1:使用主動輪廓(snake)將圖像分割成前景和背景
實例2:基于邊緣‘edge’方法的主動輪廓圖像分割
實例3:基于區(qū)域‘Chan-Vese’方法的主動輪廓圖像分割(可交互式創(chuàng)建多邊形遮罩)
本例程的配套完整源碼和圖片素材下載
主動輪廓方法,也稱為?snake,是一種迭代式區(qū)域增長圖像分割算法。使用主動輪廓算法,您可以在圖像上指定初始曲線,然后使用?activecontour?函數使曲線向對象邊界演化。
activecontour函數
BW?= activecontour(A,mask,n)?
使用主動輪廓將圖像?A?分割成前景(對象)和背景區(qū)域。mask?參數是一個指定主動輪廓初始狀態(tài)的二值圖像。mask?中對象區(qū)域(白色)的邊界定義輪廓演化的初始輪廓位置,以用于分割圖像。輸出圖像?BW?是一個二值圖像,前景為白色(邏輯 true),背景為黑色(邏輯 false)。要獲得更快、更準確的分割結果,請指定靠近所需對象邊界的初始輪廓位置。通過最多迭代?n?次的輪廓演化來分割圖像。
實例1:使用主動輪廓(snake)將圖像分割成前景和背景
%%使用主動輪廓分割圖像%% close all; %關閉當前所有圖形窗口,清除工作空間所有變量 clear all; clc; %%讀取并顯示灰度圖像 I = imread('coins.png');%讀取圖像 figure,imshow(I)%顯示圖像 title('Original Image')%添加標簽 %%指定關注對象周圍的初始輪廓。顯示該輪廓 mask = zeros(size(I));%初始化一個與I圖像一樣大小的值都為0的圖像mask %mask(Y1:Y2,X1:X2),(X1,Y1)為矩形左上角,(X1,Y2)為矩形右下角 mask(25:end-25,25:end-25) = 1;%調整mask區(qū)域,x軸為(25~X_max_size-25),y軸為(25~Y_max_size-25)的區(qū)域賦值為1(純白) figure,imshow(mask)%顯示mask圖像 title('Initial Contour Location')%添加標簽 %%使用默認方法的300次迭代對圖像進行分割 bw = activecontour(I,mask,300);%調用activecontour函數 figure, imshow(bw);%顯示分割圖像 title('Segmented Image');%添加標簽? ? ??? ? ? ?? ? ??? ? ? ? ??
? ? ? ? ? ? ? ?輸入初始圖像I? ? ? ? ? ? ? ? ? ? 設定初始輪廓圖像mask? ? ? ? ?默認100次迭代分割結果圖像bw? ? 300次迭代分割結果圖像bw
實例2:基于邊緣‘edge’方法的主動輪廓圖像分割
%%使用主動輪廓和交互式掩膜分割圖像%% close all;%關閉當前所有圖形窗口,清除工作空間所有變量 clear all; clc; I = imread('toyobjects.png');%讀取圖像 imshow(I)%顯示圖像 hold on title('Original Image');%添加標簽 %%指定靠近要分割對象的初始輪廓位置 mask = false(size(I));%初始化一個與I圖像一樣大小的值都為0的圖像mask %mask(Y1:Y2,X1:X2),(X1,Y1)為矩形左上角,(X1,Y2)為矩形右下角 mask(50:150,40:170) = true;%調整mask區(qū)域,x軸為(40~170),y軸為(50~150)的區(qū)域賦值為1(純白) %figure,imshow(mask)%顯示mask圖像 visboundaries(mask,'Color','b');%在原始圖像上以藍色顯示初始輪廓 %%使用'edge'方法分割圖像并設置200次迭代 bw = activecontour(I, mask, 200, 'edge'); %%在原始圖像上以紅色顯示最終輪廓 visboundaries(bw,'Color','r'); title('Initial contour (blue) and final contour (red)');%添加標簽 %%顯示分割圖像 figure, imshow(bw) title('Segmented Image');%添加標簽??????
? ? ? ? ? ? ?輸入初始圖像I? ? ? ? ? ? ? ? ? ? ? ? ? 初始輪廓圖像mask? ? ? ? ? ??‘edge’方法分割結果輪廓圖像? ? ? ? ? ? ? ? 分割二值圖像bw
實例3:基于區(qū)域‘Chan-Vese’方法的主動輪廓圖像分割(可交互式創(chuàng)建多邊形遮罩)
%平滑因子 'SmoothFactor' -分割區(qū)域的邊界的平滑或規(guī)律性的程度 1.5 %收縮偏置'ContractionBias'-輪廓向外增長或向內收縮的趨勢 %正值使輪廓向內收縮(收縮)。負值使輪廓線向外擴展(擴展)。 0.4 I = imread('toyobjects.png');%讀取圖像 imshow(I)%顯示 title('Original Image')%添加標簽 str = 'Click to select initial contour location. Double-click to confirm and proceed.'; title(str,'Color','b','FontSize',12); disp(sprintf('\nNote: Click close to object boundaries for more accurate result.')) %%交互式地指定初始輪廓 %鼠標左鍵每單擊一處確定選取輪廓多邊形一個頂點,雙擊完成選取 mask = roipoly;%用鼠標畫多邊形的函數 figure, imshow(mask)%顯示輪廓 title('Initial MASK');%添加標簽 %%分割圖像,設置最大迭代200次 maxIterations = 200; bw = activecontour(I, mask, maxIterations, 'Chan-Vese');%調用activecontour函數 figure, imshow(bw)%顯示分割圖像 title('Segmented Image');%添加標簽? ????? ??
? ? ? ? ? ? ? ?輸入初始圖像I? ? ? ? ? ? ? ? ? 交互式地指定初始輪廓圖像mask? ? ? ? ? ?初始輪廓mask? ? ???‘Chan-Vese’方法分割結果圖像bw
注:
1、分割的輸入圖像I需要指定為灰度圖像
2、分割開始演化的初始輪廓mask,需指定為與I相同大小的二值圖像
3、在分割演化過程中執(zhí)行的最大迭代次數n,指定為數值標量。如果當前迭代中的輪廓位置與最近5次迭代的輪廓位置之一相同,或者達到最大迭代次數,則activecontour停止活動輪廓的演化。如果初始輪廓位置(由掩模中的區(qū)域邊界指定)遠離目標邊界,則可能需要指定較高的n值來實現(xiàn)預期的分割結果。
4、主動輪廓的方法主要有‘Chan-Vese'?(default默認) (基于區(qū)域的能量模型)和?'edge'(基于邊緣的模型)兩種
5、輸出分割圖像bw,作為與輸入圖像I相同大小的二值圖像返回。前景為白色(邏輯為真),背景為黑色(邏輯為假)。
?
參考文獻:
[1] T. F. Chan, L. A. Vese,?Active contours without edges. IEEE Transactions on Image Processing, Volume 10, Issue 2, pp. 266-277, 2001
[2] V. Caselles, R. Kimmel, G. Sapiro,?Geodesic active contours. International Journal of Computer Vision, Volume 22, Issue 1, pp. 61-79, 1997.
[3] R. T. Whitaker,?A level-set approach to 3d reconstruction from range data. International Journal of Computer Vision, Volume 29, Issue 3, pp.203-231, 1998.
總結
以上是生活随笔為你收集整理的Matlab图像分割---使用主动轮廓 (snake) 方法进行图像分割的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 世界语言对应的简写
- 下一篇: java编程用什么文本编辑器_编程必备,