Matlab圖像分割——區域生長法分割代碼
[fileName,pathName] = uigetfile('*.*','Please select an image');%檔案筐,選擇檔案
if(fileName)
fileName = strcat(pathName,fileName);
fileName = lower(fileName);%一緻的小寫字母形式
else
J = 0;%記錄區域生長所分割得到的區域
msgbox('Please select an image');
return; %退出程式
end
I = imread(fileName);
if( ~( size(I,3)-3 ))
I = rgb2gray(I);%轉化為單通道灰階圖
end
I = im2double(I); %圖像灰階值歸一化到[0,1]之間
if( exist('x','var') == 0 && exist('y','var') == 0)
imshow(I,[]);
hold on;
[y,x] = getpts;%滑鼠取點 回車确定
x = round(x(1));%選擇種子點
y = round(y(1));
end
J = zeros(size(I)); % 主函數的傳回值,記錄區域生長所得到的區域
Isizes = size(I);
reg_mean = I(x,y);%表示分割好的區域内的平均值,初始化為種子點的灰階值
reg_size = 1;%分割的到的區域,初始化隻有種子點一個
neg_free = 10000; %動态配置設定記憶體的時候每次申請的連續空間大小
neg_list = zeros(neg_free,3);
neg_pos = 0;%用于記錄neg_list中的待分析的像素點的個數
pixdist = 0;
neigb = [ -1 0;1 0; 0 -1; 0 1]; %開始進行區域生長
%大于reg_maxdis,區域生長結束
while (pixdist < 0.06 && reg_size < numel(I))
%增加新的鄰域像素到neg_list中
for j=1:4
xn = x + neigb(j,1);
yn = y + neigb(j,2);
%檢查鄰域像素是否超過了圖像的邊界
ins = (xn>=1)&&(yn>=1)&&(xn<=Isizes(1))&&(yn<=Isizes(1));
%如果鄰域像素在圖像内部,并且尚未分割好;那麼将它添加到鄰域清單中
if( ins && J(xn,yn)==0)
neg_pos = neg_pos+1;
neg_list(neg_pos,:) =[ xn, yn, I(xn,yn)];%存儲對應點的灰階值
J(xn,yn) = 1;%标注該鄰域像素點已經被通路過 并不意味着,他在分割區域内
end
end
%如果配置設定的記憶體空問不夠,申請新的記憶體空間
if (neg_pos+10>neg_free)
neg_free = neg_free + 100000;
neg_list((neg_pos +1):neg_free,:) = 0;
end
dist = abs(neg_list(1:neg_pos,3)-reg_mean);
[pixdist,index] = min(dist);
%計算區域的新的均值
reg_mean = (reg_mean * reg_size +neg_list(index,3))/(reg_size + 1);
reg_size = reg_size + 1;
%将舊的種子點标記為已經分割好的區域像素點
J(x,y)=2;%标志該像素點已經是分割好的像素點
x = neg_list(index,1);
y = neg_list(index,2);
neg_list(index,:) = neg_list(neg_pos,:);
neg_pos = neg_pos -1;
end
J = (J==2);%我們之前将分割好的像素點标記為2
hold off;
figure,imshow(J);
figure,imshow(I+J);
Matlab圖像分割(三)區域生長法
Matlab圖像分割(三)區域生長法