matlab 區域生長算法生成二值圖像邊界區域


function ret=growseed()
%=====區域生長算法========
%input :二值圖像數據
%output:邊界點二值圖像數據
global I;global M;
global N;global Y;global T;global newy;global newx;%==邊界點x,y坐標
%獲取多張圖片的二值數據
tempI=draw();   %tempI 36*45*numbertotal
count=length(tempI(1,1,:));
wide=length(tempI(:,1,1));%36
high=length(tempI(1,:,1));%45
result=zeros(wide,high,count);
for k=1:count
I=tempI(:,:,k);
% figure,imshow(I),title('原始圖像')
I=double(I);
[M,N]=size(I);
[seedx,seedy]=searchseed(I);
Y=zeros(M,N);          %作一個全零與原圖像等大的圖像矩陣Y,作為輸出圖像矩陣
T=zeros(M,N);%標記點。。。
newx=0;newy=0;
calseed(seedx,seedy);
figure,imshow(Y);
% if k>1&&k<count
% result(:,:,k)=Y;
%  figure,imshow(Y);
% else
%     result(:,:,k)=T;
% %     imshow(T);
% %     figure,imshow(T);
% end
end



ret=result;
end

function calseed(seedx,seedy)
global M;
global N;
global Y;
global I;
global newx;
global newy;

global T;
for i = -1 : 1
        for j = -1 : 1
            newseedx = seedx + i;
            newseedy = seedy+ j;
            %生長准則:判斷生長點8鄰域內像素的各自灰度值是否與生長點所在像素灰度值相等
            if newseedx> 0 && newseedx <= M && newseedy > 0 && newseedy <= N &&T(newseedx,newseedy)==0&&I(newseedx,newseedy)==1
                T(newseedx,newseedy)=1;
                if isequal(newseedx,newseedy)==1
                    calseed(newseedx,newseedy);
                else
                    Y(newx,newy)=1;%set邊界點值為1
                end  
            end
        end
end
     
end

function ret=isequal(x,y)%====判斷點的領域是否相等
%===輸入1個點的x,y坐標
%==返回1 相等
global I;
global newx;
global newy;
global M;
global N;
ret=1;
tag=0;
for i = -1 : 1
    if tag==0
        for j = -1 : 1
         if x+i> 0 && x+i <= M && y+j > 0 && y+j <= N
          if I( x+i,y+j)==0
              ret=0;
              tag=1;
              newx=x+i;
              newy=y+j;
          end
         end
        end
    end
end


end

function [x,y]=searchseed(I)
%=========尋找種子點=====
%Input:一張二值數據的圖片
%Output:返回種子點的x,y坐標

%======求數據為1的質心====
[M,N]=size(I);
corx=0;
cory=0;
count=0;
for i=1:M
    for j=1:N
        if I(i,j)==1
            corx=corx+i;
            cory=cory+j;
            count=count+1;
        end
    end
end
x=round(corx/count);
y=round(cory/count);

end

  

處理結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM