www.pudn.com > REGIONGROW.rar > REGIONGROW.m, change:2001-07-20,size:2648b


%函数regiongrow.m: 像素聚类区域成长法% 
function [O_image]=regiongrow(I_image,seed,region_th,stopn) 
%[O_image]=regiongrow(I_image,seed,region_th,stopn)% 
%I_image : (row x col) 输入图像%   
%seed : [yseed xseed] 输入一聚合种子的坐标% 
%region_th : (0<= region_th <=255) 区域临界值% 
%stopn : (0<stopn<=inf) 中断临界值:控制中断程序的聚合像素个数% 
%O_image : (row x col) 经过像素聚类区域成长后的输出图像% 
 
O_image=I_image; 
[row,col]=size(O_image); 
%将种子放入队列中 
yseed=seed(1); 
xseed=seed(2); 
pixel_seed=I_image(yseed,xseed);  %种子的像素值 
queue=[yseed xseed];              %将种子的坐标放入队列中 
top=1;                            %设定队列矩阵的顶端位置 
 
%制造一个标注像素聚合的矩阵% 
region_matrix=zeros(row,col);   
region_matrix(yseed,xseed)=1;     %若判定为相同区域,则标注为1,反之为0 
 
%开始像素聚合% 
region_count=1;          %制造一个聚合区域的计数器 
while top~=0             %当队列矩阵中没有存放任何坐标时,则停止循环  
  %取出队列矩阵中的最底端坐标值% 
  row_buttom=queue(1,1); 
  col_buttom=queue(1,2); 
  pixel_buttom=I_image(row_buttom,col_buttom);  
  %以此坐标轴为种子,判断周围各像素是否属于相同的区域% 
  regionedge=0;                                                  
 %设一个判断是否为区域边沿的指标% 
  for i=-1:1 
    for j=-1:1 
       if row_buttom+i<=row & row_buttom+i>0 &... 
             col_buttom+j<=col & col_buttom+j>0 
        if abs(I_image(row_buttom+i,col_buttom+j)-pixel_buttom)... 
              <=region_th & region_matrix(row_buttom+i,col_buttom+j)~=1 
               %若像素之间的差值小于区域临界值,则判定为同一区域% 
               top=top+1;        %队列矩阵顶端top值增加1 
               %将此像素的坐标存入队列矩阵的顶端% 
               queue(top,:)=[row_buttom+i col_buttom+j];  
                
               region_matrix(row_buttom+i,col_buttom+j)=1;%标注为1 
               region_count=region_count+1; 
               %将放入队列的像素值均先内设为0% 
               O_image(row_buttom+i,col_buttom+j)=0;  
            end 
            if region_matrix(row_buttom+i,col_buttom+j)==0 
               regionedge=1;          %判断为区域边沿 
            end 
          else 
            regionedge=1;             %判断为区域边沿 
          end 
      end 
   end 
   %将判断为非聚合区域边沿的像素值用种子的像素值取代%   
   if regionedge~=1 
      O_image(row_buttom,col_buttom)=I_image(yseed,xseed); 
   end 
   %若计数值大于或等于所设定的中断临界值,则将不再进行聚合循环% 
   if region_count>=stopn 
      top=1; 
   end 
   %将已经做完聚合的坐标从队列矩阵中删去% 
   queue=queue(2:top,:); 
   top=top-1; 
end 
O_image(yseed,xseed)=0;         %将种子像素值设为0,即黑色