⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 label_wy.m

📁 在matlab环境下
💻 M
字号:
%图像标号
clear all
g=imread('label.bmp');
g=logical(g);
g=imcomplement(g);
f=g;
figure(1)
imshow(f)
[r c]=size(f);
label=zeros(r,c);
scan=zeros(r+1,c+2);       %扩充原始图像的边界以便检测
scan(2:r+1,2:c+1)=f;
scan(1,:)=0;
scan(:,1)=0;
scan(:,c+2)=0;
label_s=zeros(r+1,c+2);
kind=1;                    
temp=1;                    %第一次扫描存储目标个数
same1=0;
t=1;
for i=1:r+1
    for j=1:c+1
        if(scan(i,j)==1)
            if((label_s(i,j-1)|label_s(i-1,j-1)...%检测左、左上、上、右上四邻域是否被标记
                    |label_s(i-1,j)|label_s(i-1,j+1))==1)
                if(label_s(i,j-1)) %若已有标记的像素,则依次以左、左、左上、上、右上四邻域标记当前像素
                    label_s(i,j)=label_s(i,j-1);                   
                elseif(label_s(i-1,j-1))
                    label_s(i,j)=label_s(i-1,j-1);                  
                elseif(label_s(i-1,j))
                    label_s(i,j)=label_s(i-1,j);                   
                else
                    label_s(i,j)=label_s(i-1,j+1);
                end                
            else               %未标记
                k=j+1;         %右移一位               
                  if(scan(i,k)==0)      %若该像素灰度为0,则表示当前像素达到右边界,表示是新目标
                      label_s(i,j)=temp;
                      temp=temp+1;
                  else                 
                    while(scan(i,k+1)) %再右移一位,检测其右边的像素是否达到右边界
                      if(label_s(i-1,k+1))%若该像素的右上像素已标记,则有此标记标记当前像素
                          label_s(i,j)=label_s(i-1,k+1); 
                          break
                      else
                          k=k+1;  %否则再右移
                      end                     
                    end
                    if(scan(i,k+1)==0)
                      label_s(i,j)=temp;
                      temp=temp+1;
                    end
                  end                
            end       
            if(label_s(i-1,j+1)~=0&&label_s(i-1,j)==0&&label_s(i,j)~=0) %处理下凹目标                
                if(label_s(i,j)~=label_s(i-1,j+1)) %把同一目标上不同标记符存入等价数组same1
                   same1(1,t)=label_s(i,j);
                   same1(2,t)=label_s(i-1,j+1);
                   t=t+1;
                end
            end           
        end       
    end
end
label=label_s(2:r+1,2:c+1);
temp=temp-1;
same2=zeros(temp,1);
same3=zeros(temp,1);
%扫描等价数组,检测等价标号
for u=same1
    if(same2(u(1))==0&&same2(u(2))==0)
        same2(u(1))=kind;
        same2(u(2))=kind;
        kind=kind+1;
    elseif(xor(same2(u(1)),same2(u(2)))==1) 
        if(same2(u(1)))
            same2(u(2))=same2(u(1));
        else
            same2(u(1))=same2(u(2));
        end
    else
        if(same2(u(1))<same2(u(2)))
            same2(u(2))=same2(u(1));
        else
            same2(u(1))=same2(u(2));
        end
    end
end
%对等价标号进行替换
result=0;
for i=1:temp
    if(same2(i)==0)
        result=result+1;
        same3(i)=result;
    else
        if(i==1)
            same3(i)=1;
            result=result+1;
        else
            index=find(same2(1:i-1)==same2(i));
            if(isempty(index))
                result=result+1;
                same3(i)=result;
            else
                same3(i)=same3(index(1));
            end
        end
    end
end
%再扫描标号矩阵,替换等价标号
for i=1:temp
    label(find(label==i))=same3(i);
end                         
m=zeros(2,result);
for i=1:result
    [p,q]=find(label==i);
    temp=[p,q];
    [x,y]=size(temp);
    m(1,i)=sum(p)/x;
    m(2,i)=sum(q)/x;
end

figure(2)
imshow(f)
hold on
for i=1:result
    figure(2)
    plot(m(2,i),m(1,i),'*')
    hold on
end


                
                

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -