📄 label_wy.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 + -