《matlab链码程序.docx》由会员分享,可在线阅读,更多相关《matlab链码程序.docx(11页珍藏版)》请在三一办公上搜索。
1、matlab链码程序map1=imread(leaf.jpg);row,col,dep=size(map1); %行,列,深度值map=zeros(row,col);pixsum=row*col; %像素总数%灰度化for i=1:rowfor j=1:colmap(i,j)=0.11*map1(i,j,1)+0.59*map1(i,j,2)+0.3*map1(i,j,3);endend%灰度化完成,输出灰度图%figure(1)%imshow(map,)%title(原始灰度图像)Y=zeros(row,col); %存储输出图像%二值化for i=1:rowfor j=1:colif ma
2、p1(i,j)>170Y(i,j)=0;elseY(i,j)=1;endendendfigure(2)imshow(Y,)title(二值化后图像)A1=sum(sum(Y);%腐蚀B=ones(3,3);%腐蚀剂OUT1=zeros(row,col);%程序中间输出1OUT=zeros(row,col);%输出边界图像a=0;for i=2:row-1for j=2:col-1a=sum(sum(Y(i-1:i+1,j-1:j+1).*B);if a=9OUT1(i,j)=1;elseOUT1(i,j)=0;endendendOUT=Y-OUT1;figure(3)imshow(OUT,
3、)title(边界图像)%以下为链码程序xi=;yi=;%连续存储对应的点坐标stack=0 0;%存储当前点坐标for i=1:rowfor j=1:colif OUT(i,j)>0stack=i,j;breakendendif stack(1)=0breakendendY=OUT;%逆时针,左下45度开始计算链码code=;%存储链码dir=1 -1;%链码前进方向dircode=5;stack0=stack;%前一点的坐标m=stack(1);%固定起始点坐标,并在灰度图中标示。n=stack(2);map(m,n)=0;fprintf(链码起始点坐标为n,m,n)figure(1)
4、imshow(map,)title(灰度图像)stack=0 0;c=1;while stack(1)=m|stack(2)=n%直至回到起始点停止链码stack=stack0+dir;while Y(stack(1),stack(2)=1a=dir(1);b=dir(2);%根据当前方向,逆时针旋转45度调整新方向 while c=1if a=0&b=-1dir=1 -1;dircode=5;break;endif a=-1&b=-1dir=0 -1;dircode=4;break;endif a=-1&b=0dir=-1 -1;dircode=3;break;endif a=-1&b=1d
5、ir=-1 0;dircode=2;break;endif a=0&b=1dir=-1 1;dircode=1;break;endif a=1&b=1dir=0 1;dircode=0;break;endif a=1&b=0dir=1 1;dircode=7;break;endif a=1&b=-1dir=1 0;dircode=6;break;endendstack=stack0+dir;endcode=code dircode;stack0=stack;xi=xi stack(1);yi=yi stack(2);%找到新的目标点之后,顺时针旋转90度后再继续循环while c=1if a=
6、0&b=-1dir=-1 0;dircode=2;break;end if a=1&b=0dir=0 -1;dircode=4;break;end if a=0&b=1dir=1 0;dircode=6;break;end if a=-1&b=0dir=0 1;dircode=0;break;end if a=1&b=1dir=1 -1;dircode=5;break;end if a=-1&b=1dir=1 1;dircode=7;break;end if a=-1&b=-1dir=-1 1;dircode=1;break;end if a=1&b=-1dir=-1 -1;dircode=3
7、;break;end endendfprintf(所得链码为:coden)%以下计算差分码deltacode=zeros(1,length(code);for i=1:length(code)-1deltacode(i)=code(i+1)-code(i);enddeltacode(length(code)=code(1)-code(length(code);for i=1:length(deltacode)if deltacode(i)<0deltacode(i)=deltacode(i)+8;endendfprintf(对应的差分码为:deltacoden)%以下计算区域边界长度,存储
8、在P中M N=size(xi);%N为链码长度cnt=0;for i=1:Nif code(1,i)=0|code(1,i)=2|code(1,i)=4|code(1,i)=6cnt=cnt+1;endendP=cnt+sqrt(2)*(N-cnt);fprintf(边界周长为:%dn,P)%以下计算链码边界所包围的区域面积,存储在A中A=0;xi=m xi;yi=n yi;for i=1:NA=A+1/2*(xi(i)*yi(i+1)-xi(i+1)*yi(i);endfprintf(通过二值图像求和方式计算得到的区域面积为:%dn,A1)fprintf(通过三角形法计算链码边界包围的区域面积为:%dn,A)