當前位置:
首頁 >
区域生长算法原理及MATLAB实现
發(fā)布時間:2025/3/15
33
豆豆
生活随笔
收集整理的這篇文章主要介紹了
区域生长算法原理及MATLAB实现
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1. 基于區(qū)域生長算法的圖像分割原理
數(shù)字圖像分割算法一般是基于灰度值的兩個基本特性之一:不連續(xù)性和相似性。前一種性質(zhì)的應(yīng)用途徑是基于圖像灰度的不連續(xù)變化分割圖像,比如圖像的邊緣。第二種性質(zhì)的主要應(yīng)用途徑是依據(jù)實現(xiàn)指定的準則將圖像分割為相似的區(qū)域。區(qū)域生長算法就是基于圖像的第二種性質(zhì),即圖像灰度值的相似性。1.1 基本公式
令R表示整幅圖像區(qū)域,那么分割可以看成將區(qū)域R劃分為n個子區(qū)域R1,,R2,......Rn的過程,并需要滿足以下條件: a: U(Ri) = R; b: Ri是一個連通區(qū)域,i=1,2,3,......n; c: Ri ∩ Rj = 空集,對于任何的i,j;都有i≠j; d: P(Ri) = Ture, 對i=1,2,......n; e: R(Pi U Rj) = False, i≠j; 正如“區(qū)域生長”的名字所暗示的:區(qū)域生長是根據(jù)一種事先定義的準則將像素或者子區(qū)域聚合成更大區(qū)域的過程,并且要充分保證分割后的區(qū)域滿足a~e的條件。1.2 區(qū)域生長算法設(shè)計思路
區(qū)域生長算法的設(shè)計主要由以下三點:生長種子點的確定,區(qū)域生長的條件,區(qū)域生長停止的條件。種子點的個數(shù)根據(jù)具體的問題可以選擇一個或者多個,并且根據(jù)具體的問題不同可以采用完全自動確定或者人機交互確定。 區(qū)域生長的條件實際上就是根據(jù)像素灰度間的連續(xù)性而定義的一些相似性準則,而區(qū)域生長停止的條件定義了一個終止規(guī)則,基本上,在沒有像素滿足加入某個區(qū)域的條件的時候,區(qū)域生長就會停止。在算法里面,定義一個變量,最大像素灰度值距離reg_maxdist.當待加入像素點的灰度值和已經(jīng)分割好的區(qū)域所有像素點的平均灰度值的差的絕對值小于或等于reg_maxdist時,該像素點加入到已經(jīng)分割到的區(qū)域。相反,則區(qū)域生長算法停止。 在種子店1的4鄰域連通像素中,即2、3、4、5點,像素點5的灰度值與種子點的灰度值最接近,所以像素點5被加入到分割區(qū)域中,并且像素點5會作為新的種子點執(zhí)行后面的過程。在第二次循環(huán)過程中,由于待分析圖像中,即2、3、4、6、7、8,像素7的灰度值和已經(jīng)分割的區(qū)域(由1和5組成)的灰度均值10.5最接近,所以像素點7被加入到分割區(qū)域中。最后一幅圖,示意了區(qū)域生長的方向(由淺入深)。 從上面的分析中,我們可以看出,在區(qū)域生長過程中,需要知道待分析像素點的編號(通過像素點的x和y坐標值來表示),同時還要知道這些待分析點的像素的灰度值。1.3 區(qū)域生長算法偽代碼
begin 初始化變量 pixdist = 0; 交互式選擇一個種子點,并且初始化區(qū)域的灰度均值變量reg_mean為該種子點的灰度值。 while (pixdist < reg_maxdist) 將當前種子點的四鄰域像素點加入到鏈表neg_list中; 分別計算neg_list中所有元素的灰度值和reg_mean差的絕對值,并且得到最小值的元素i(x,y).令pixdist = abs(neg_list(i,3)-reg_mean); 更新 reg_mean = (reg_mean*reg_size + neg_list(i,3))/(reg_size + 1);(注:reg_size表示分割好區(qū)域內(nèi)像素點的數(shù)量) 將舊的種子點標記為已經(jīng)分割好的區(qū)域像素點; 將i(x,y)當做新的種子點,并將新的種子點i(x,y)從鏈表neg_list中移除 end end1.4 基于MATLAB的區(qū)域生長算法設(shè)計
% Segment based on area, Region Growing; clear all; close all; clc [fileName,pathName] = uigetfile('*.*','Please select an image');%文件筐,選擇文件 if(fileName)fileName = strcat(pathName,fileName);fileName = lower(fileName);%一致的小寫字母形式 else J = 0;%記錄區(qū)域生長所分割得到的區(qū)域msgbox('Please select an image');return; %退出程序 endI = imread(fileName); if( ~( size(I,3)-3 ))I = rgb2gray(I);%轉(zhuǎn)化為單通道灰度圖 end I = im2double(I); %圖像灰度值歸一化到[0,1]之間 Ireshape = imresize(I,[600,800]); I = Ireshape(51:475,200:699); gausFilter = fspecial('gaussian',[5 5],0.5); I = imfilter(I,gausFilter,'replicate');%種子點的交互式選擇 if( exist('x','var') == 0 && exist('y','var') == 0)subplot(2,2,1),imshow(I,[]);hold on;[y,x] = getpts;%鼠標取點 回車確定x = round(x(1));%選擇種子點y = round(y(1)); endif( nargin == 0)reg_maxdist = 0.1;%nargin是matlab代碼編寫中常用的一個技巧,主要用于計算當前主函數(shù)的輸入?yún)?shù)個%數(shù),一般可以根據(jù)nargin的返回值來確定主函數(shù)輸入?yún)?shù)的缺省值。在實現(xiàn)中,如果%用戶輸入的參數(shù)個數(shù)為零,那么默認為0.2 end J = zeros(size(I)); % 主函數(shù)的返回值,記錄區(qū)域生長所得到的區(qū)域 Isizes = size(I); reg_mean = I(x,y);%表示分割好的區(qū)域內(nèi)的平均值,初始化為種子點的灰度值 reg_size = 1;%分割的到的區(qū)域,初始化只有種子點一個 neg_free = 10000; %動態(tài)分配內(nèi)存的時候每次申請的連續(xù)空間大小 neg_list = zeros(neg_free,3); %定義鄰域列表,并且預(yù)先分配用于儲存待分析的像素點的坐標值和灰度值的空間,加速 %如果圖像比較大,需要結(jié)合neg_free來實現(xiàn)matlab內(nèi)存的動態(tài)分配 neg_pos = 0;%用于記錄neg_list中的待分析的像素點的個數(shù) pixdist = 0; %記錄最新像素點增加到分割區(qū)域后的距離測度 %下一次待分析的四個鄰域像素點和當前種子點的距離 %如果當前坐標為(x,y)那么通過neigb我們可以得到其四個鄰域像素的位置 neigb = [ -1 0;1 0;0 -1;0 1];%開始進行區(qū)域生長,當所有待分析的鄰域像素點和已經(jīng)分割好的區(qū)域像素點的灰度值距離%大于reg_maxdis,區(qū)域生長結(jié)束while (pixdist < 0.06 && reg_size < numel(I))%增加新的鄰域像素到neg_list中for j=1:4xn = x + neigb(j,1);yn = y + neigb(j,2);%檢查鄰域像素是否超過了圖像的邊界ins = (xn>=1)&&(yn>=1)&&(xn<=Isizes(1))&&(yn<=Isizes(1));%如果鄰域像素在圖像內(nèi)部,并且尚未分割好;那么將它添加到鄰域列表中if( ins && J(xn,yn)==0)neg_pos = neg_pos+1;neg_list(neg_pos,:) =[ xn, yn, I(xn,yn)];%存儲對應(yīng)點的灰度值J(xn,yn) = 1;%標注該鄰域像素點已經(jīng)被訪問過 并不意味著,他在分割區(qū)域內(nèi)endend%如果分配的內(nèi)存空問不夠,申請新的內(nèi)存空間if (neg_pos+10>neg_free)neg_free = neg_free + 100000;neg_list((neg_pos +1):neg_free,:) = 0;end%從所有待分析的像素點中選擇一個像素點,該點的灰度值和已經(jīng)分割好區(qū)域灰度均值的%差的絕對值時所待分析像素中最小的dist = abs(neg_list(1:neg_pos,3)-reg_mean);[pixdist,index] = min(dist);%計算區(qū)域的新的均值reg_mean = (reg_mean * reg_size +neg_list(index,3))/(reg_size + 1);reg_size = reg_size + 1;%將舊的種子點標記為已經(jīng)分割好的區(qū)域像素點J(x,y)=2;%標志該像素點已經(jīng)是分割好的像素點x = neg_list(index,1);y = neg_list(index,2); % pause(0.0005);%動態(tài)繪制 % if(J(x,y)==2) % plot(x,y,'r.'); % end%將新的種子點從待分析的鄰域像素列表中移除neg_list(index,:) = neg_list(neg_pos,:);neg_pos = neg_pos -1;endJ = (J==2);%我們之前將分割好的像素點標記為2hold off;subplot(2,2,2),imshow(J);J = bwmorph(J,'dilate');%補充空洞subplot(2,2,3),imshow(J);subplot(2,2,4),imshow(I+J);2. 算法實驗分析
2.1 CT圖像實驗-分割肝臟實質(zhì)
2.2 US圖像實驗-分割肝臟血管
? ? ? ? ??分割不完整
過分割
? ? ? 對有明顯邊界的分割效果好
3.算法應(yīng)用總結(jié)
1.對CT圖像、MR圖像以及所有的具有邊界效應(yīng),或者是該區(qū)域與外界區(qū)域有明顯差距的圖像,分割效果很好。 2.對感興趣區(qū)域與外接區(qū)域存在邊緣連通現(xiàn)象的圖像,分割效果很差。如超聲圖像,肝臟對超聲的反應(yīng)就是“均勻性”散點回聲。這造成“基于鄰域像素相似性”分割很難應(yīng)用。閾值設(shè)置的小,造成分割不完整;閾值設(shè)置得太大,造成過分割現(xiàn)象。總結(jié)
以上是生活随笔為你收集整理的区域生长算法原理及MATLAB实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 飞鸽传书从微软官网上了解到微软正在推动虚
- 下一篇: 反向链接推进技巧: 有技巧的“跟风”策略