%%初始化clc;clear;clf;%%录入原图像I1=imread('rice.png');I1=double(I1);[m,n]=size(I1);%%均值滤波I=zeros(m,n);fori=2:m-1%历遍原图像forj=2:n-1I(i,j)=I1(i-1,j-1)+I1(i-1,j)+I1(i-1,j+1)+...I1(i,j-1)+I1(i,j)+I1(i,j+1)+I1(i+1,j-1)+...I1(i+1,j)+I1(i+1,j+1);%求取均值I(i,j)=I(i,j)/9;endend%%Soble算子检测边缘,并保存原图中每个像素相对应的梯度模长和方位角Muchang=zeros(m,n);%建立矩阵保存对应像素的梯度模长Jiaodu=zeros(m,n);%建立矩阵保存对应像素的方位角Bianyuantu=zeros(m,n);%建立边缘检测图矩阵hv=fspecial('sobel');%建立Sobel算子模板hh=hv.';gv=abs(imfilter(I,hv,'replicate'));%滤波运算gh=abs(imfilter(I,hh,'replicate'));Muchang=sqrt(gv.^2+gh.^2);%保存模长量Jiaodu=atan(gh./gv);%保存角度量fori=2:m-1forj=2:n-1%历遍模长矩阵ifMuchang(i,j)205%建立删选条件Bianyuantu(i,j)=0;elseBianyuantu(i,j)=1;endendend%%显示边缘图subplot(121);imshow(Bianyuantu);title('边缘图像');%%边缘连接Lianjietu=zeros(m,n);%建立连接图矩阵,大小和边缘图一样fori=3:m-2forj=3:n-2%历遍边缘图中的每一个点(此处缺陷:丢失四个外界)ifBianyuantu(i,j)==1%查找每一个边缘点%Lianjietu(i,j)=Bianyuantu(i,j);%将此边缘点保存在连接图中forx=-2:2fory=-2:2%历遍原图中以中心点为3邻域的模板中像素if(abs(Muchang(i,j)-Muchang(i+x,j+y))...35)&&(abs(Jiaodu(i,j)-Jiaodu(i+x,j+y))...15*pi/180)%同时满足大小和方向条件Lianjietu(i+x,j+y)=1;%将满足条件的点点亮(相连)endendendendendend%%显示连接图subplot(122);imshow(Lianjietu);title('边缘连接图像');