logo资料库

骨架提取和交叉点检测的matlab实现.pdf

第1页 / 共2页
第2页 / 共2页
资料共2页,全文预览结束
骨架提取和交叉点检测的matlab实现实现 骨架提取和交叉点检测的 本文介绍了骨架提取和交叉点检测的matlab实现,用的是中轴法,细化法检测出来的是边缘。 map1=imread('p.jpg'); [row,col,dep]=size(map1); %行,列,深度值 map=zeros(row,col); pixsum=row*col; %像素总数 %灰度化 for i=1:row for j=1:col map(i,j)=0.11*map1(i,j,1)+0.59*map1(i,j,2)+0.3*map1(i,j,3); end end %灰度化完成,输出灰度图 figure(1) imshow(map,[]) title('原始灰度图像') Y=zeros(row,col); %存储输出图像 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5根据通道二值化 for i=1:row for j=1:col if map1(i,j,2)>map1(i,j,1)&&map1(i,j,2)>map1(i,j,3) Y(i,j)=1; else Y(i,j)=0; end end end figure(2) imshow(Y,[]) title('二值化后图像') %以下为骨架提取程序 temp=ones(row,col); N=0; %统计邻域内非零像素个数。 T=0; %统计0-1变换次数 for k=1:80 %大循环次数 for i=2:row-1 for j=2:col-1 a=[Y(i,j),Y(i,j-1),Y(i+1,j-1),Y(i+1,j),Y(i+1,j+1),Y(i,j+1),Y(i-1,j+1),Y(i-1,j),Y(i-1,j-1)];%邻域元素排序。中间为1,左边为2,逆时针分别为2---9 if a(1)==1 for m=1:8 if a(m)==1 N=N+1; end end for n=1:7 if a(n)==0&&a(n+1)==1 T=T+1; end end if a(8)==0&&a(1)==1 T=T+1; end end if (N>=2)&&(N<=6)&&(T==1)&&(a(2)*a(4)*a(6)==0)&&(a(4)*a(6)*a(8)==0) temp(i,j)=0; %标记要删除的点,标志为1 end N=0; T=0; end end %删除点 for i=1:row for j=1:col if temp(i,j)==0 Y(i,j)=0; end end end %第一步完成 for i=2:row-1 for j=2:col-1 a=[Y(i,j),Y(i,j-1),Y(i+1,j-1),Y(i+1,j),Y(i+1,j+1),Y(i,j+1),Y(i-1,j+1),Y(i-1,j),Y(i-1,j-1)];%邻域元素排序。中间为1,左边为2,逆时针分别为2---9 if a(1)==1 for m=2:9 if a(m)==1 N=N+1; end
end for n=1:7 if a(n)==0&&a(n+1)==1 T=T+1; end end if a(8)==0 T=T+1; end end if (N>=2)&&(N<=6)&&(T==1)&&(a(2)*a(4)*a(8)==0)&&(a(2)*a(6)*a(8)==0) temp(i,j)==0; %标记要删除的点,标志为1 end N=0; T=0; end end %删除点 for i=1:row for j=1:col if temp(i,j)==0 Y(i,j)=0; end end end %第二步完成 end %完成,输出 figure(3) imshow(Y,[]) title('提取的骨架') %以下为交叉点检测及标志,交叉点标注在灰度图中 temp1=zeros(row,col); for i=2:row-1 for j=2:col-1 c=sum(sum(Y(i-1:i+1,j-1:j+1))); if c>=4 temp1(i,j)=1; end end end for i=1:row for j=1:col if temp1(i,j)==1 map(i,j)=255; end end end %标注完成,显示灰度图 figure(4) imshow(map,[]) title('标注的交叉点')
分享到:
收藏