map1=imread('leaf.jpg');[row,col,dep]=size(map1);%行,列,深度值map=zeros(row,col);pixsum=row*col;%像素总数%灰度化fori=1:rowforj=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);%存储输出图像%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%二值化fori=1:rowforj=1:colifmap1(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;fori=2:row-1forj=2:col-1a=sum(sum(Y(i-1:i+1,j-1:j+1).*B));ifa==9OUT1(i,j)=1;elseOUT1(i,j)=0;endendendOUT=Y-OUT1;figure(3)imshow(OUT,[])title('边界图像')%以下为链码程序xi=[];yi=[];%连续存储对应的点坐标stack=[00];%存储当前点坐标fori=1:rowforj=1:colifOUT(i,j)0stack=[i,j];breakendendifstack(1)~=0breakendendY=OUT;%逆时针,左下45度开始计算链码code=[];%存储链码dir=[1-1];%链码前进方向dircode=5;stack0=stack;%前一点的坐标m=stack(1);%固定起始点坐标,并在灰度图中标示。n=stack(2);map(m,n)=0;fprintf('链码起始点坐标为(%d,%d)\n',m,n)figure(1)imshow(map,[])title('灰度图像')stack=[00];c=1;whilestack(1)~=m||stack(2)~=n%直至回到起始点停止链码stack=stack0+dir;whileY(stack(1),stack(2))~=1a=dir(1);b=dir(2);%根据当前方向,逆时针旋转45度调整新方向whilec==1ifa==0&&b==-1dir=[1-1];dircode=5;break;endifa==-1&&b==-1dir=[0-1];dircode=4;break;endifa==-1&&b==0dir=[-1-1];dircode=3;break;endifa==-1&&b==1dir=[-10];dircode=2;break;endifa==0&&b==1dir=[-11];dircode=1;break;endifa==1&&b==1dir=[01];dircode=0;break;endifa==1&&b==0dir=[11];dircode=7;break;endifa==1&&b==-1dir=[10];dircode=6;break;endendstack=stack0+dir;endcode=[codedircode];stack0=stack;xi=[xistack(1)];yi=[yistack(2)];%找到新的目标点之后,顺时针旋转90度后再继续循环whilec==1ifa==0&&b==-1dir=[-10];dircode=2;break;endifa==1&&b==0dir=[0-1];dircode=4;break;endifa==0&&b==1dir=[10];dircode=6;break;endifa==-1&&b==0dir=[01];dircode=0;break;endifa==1&&b==1dir=[1-1];dircode=5;break;endifa==-1&&b==1dir=[11];dircode=7;break;endifa==-1&&b==-1dir=[-11];dircode=1;break;endifa==1&&b==-1dir=[-1-1];dircode=3;break;endendendfprintf('所得链码为:code\n')%以下计算差分码deltacode=zeros(1,length(code));fori=1:length(code)-1deltacode(i)=code(i+1)-code(i);enddeltacode(length(code))=code(1)-code(length(code));fori=1:length(deltacode)ifdeltacode(i)0deltacode(i)=deltacode(i)+8;endendfprintf('对应的差分码为:deltacode\n')%以下计算区域边界长度,存储在P中[MN]=size(xi);%N为链码长度cnt=0;fori=1:Nifcode(1,i)==0||code(1,i)==2||code(1,i)==4||code(1,i)==6cnt=cnt+1;endendP=cnt+sqrt(2)*(N-cnt);fprintf('边界周长为:%d\n',P)%以下计算链码边界所包围的区域面积,存储在A中A=0;xi=[mxi];yi=[nyi];fori=1:NA=A+1/2*(xi(i)*yi(i+1)-xi(i+1)*yi(i));endfprintf('通过二值图像求和方式计算得到的区域面积为:%d\n',A1)fprintf('通过三角形法计算链码边界包围的区域面积为:%d\n',A)