資源簡介
采用區域生長的方式分割圖像,用戶可以用鼠標在其中選取一個種子點并按下回車鍵,之后會出現分割結果。

代碼片段和文件信息
function?J?=?regionGrow(I)
%?區域生長,需要以交互方式設定初始種子點,具體方法為鼠標單擊圖像中一點后,按下回車鍵
%
%?輸入:I?-?原圖像
%?輸出:J?-?輸出圖像
if?isinteger(I)
????I=im2double(I);
end
figureimshow(I)title(‘原始圖像‘)
[MN]=size(I);
[yx]=getpts;?????????????%獲得區域生長起始點
x1=round(x);????????????%橫坐標取整
y1=round(y);????????????%縱坐標取整
seed=I(x1y1);???????????%將生長起始點灰度值存入seed中
J=zeros(MN);??????????%作一個全零與原圖像等大的圖像矩陣J,作為輸出圖像矩陣
J(x1y1)=1;?????????????%將J中與所取點相對應位置的點設置為白
sum=seed;??????????????%儲存符合區域生長條件的點的灰度值的和
suit=1;?????????????????%儲存符合區域生長條件的點的個數
count=1;???????????????%記錄每次判斷一點周圍八點符合條件的新點的數目
threshold=0.15;?????????%閾值,注意需要和double類型存儲的圖像相符合
while?count>0
????s=0;???????????????????%記錄判斷一點周圍八點時,符合條件的新點的灰度值之和
?????count=0;
?????for?i=1:M
???????for?j=1:N
?????????if?J(ij)==1
??????????if?(i-1)>0?&&?(i+1)<(M+1)?&&?(j-1)>0?&&?(j+1)<(N+1)??%判斷此點是否為圖像邊界上的點
???????????for?u=?-1:1???????????????????????????????%判斷點周圍八點是否符合閾值條件
????????????for?v=?-1:1
??????????????if??J(i+uj+v)==0?&&?abs(I(i+uj+v)-seed)<=threshold&&?1/(1+1/15*abs(I(i+uj+v)-seed))>0.8
???????????????????????????J(i+uj+v)=1;
????????????????????%判斷是否尚未標記,并且為符合閾值條件的點
????????????????????%符合以上兩條件即將其在J中與之位置對應的點設置為白
?????????????????count=count+1;
?????????????????s=s+I(i+uj+v);??????????????????????%此點的灰度之加入s中
??????????????end
????????????end
???????????end
??????????end
?????????end
???????end
?????end
????suit=suit+count;???????????????????????????????????%將n加入符合點數計數器中
????sum=sum+s;?????????????????????????????????????%將s加入符合點的灰度值總合中
????seed=sum/suit;????????????????????????????????????%計算新的灰度平均值
end
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????37906??2012-11-25?10:06??coins.png
?????文件???????1943??2012-11-25?10:11??regionGrow.m
?????文件????????240??2012-11-25?10:19??程序說明.txt
-----------?---------??----------?-----??----
????????????????40089????????????????????3
- 上一篇:Matlab指紋圖像分割實驗報告
- 下一篇:巴特沃茲濾波器m文件,有實驗介紹和調試
評論
共有 條評論