《Canny算子提取边缘Matlab源代码.doc》由会员分享,可在线阅读,更多相关《Canny算子提取边缘Matlab源代码.doc(3页珍藏版)》请在金锄头文库上搜索。
1、Canny算子提取边缘Matlab源代码介绍function e=canny_edge(I,sigma)%functione=edge(I,canny,thresh,sigma);%该函数实现Canny算子提取边缘点%输入图像为I,标准差sigma,输出为边缘图像em,n=size(I);Rr=2:m-1;cc=2:n-1;e=repmat(logical(uint8(0),m,n);%产生同样大小的边缘图像e,初始化为1 ,即初始化边缘GaussianDieOff=-0.001;%设定高斯函数消失门限PercentOfPixelsNotEdges=-7;%用于计算边缘门限ThresholdR
2、atio=-4;%设置两个门限的比例%首先设计高斯滤波器和它的微分pw=1:30;%设定滤波器宽度ssq=sigma*sigma;%计算方差width=max(find(exp(-(pw.*pw)/(2*sigma*sigma)GaussianDieOff);%计算滤波算子宽度t=(-width:width);len=2*width+1;t3=t-.5;t;t+.5;%对每个像素左右各半个像素位置的值进行平均gau=sum(exp(-(t3.*t3)/(2*ssq)./(6*pi*ssq);%一维高斯滤波器dgau=(-t.*exp(-(t.*t)/(2*ssq)/ssq).;%高斯滤波器的微
3、分ra=size(I,1);ca=size(I,2);ay=255*double(I);ax=255*double(I);h=conv(gau,dgau);%利用高斯函数滤除噪声和用高斯算子的一阶微分对图像滤波合并为一个算子ax=conv2(ax,h,same).;%产生x方向滤波ay=conv2(ay,h,same);%产生y方向滤波mag=sqrt(ax.*ax)+(ay.*ay);%计算滤波结果的幅度magmax=max(mag(:);if magmax0mag=mag/magmax;%对滤波幅度进行归一化end%下面根据滤波幅度的概率密度计算滤波门限counts,x=imhist(ma
4、g,64);%计算滤波结果的幅度的直方图highThresh=min(find(cumsum(counts)PercentOfPixelsNotEdges*m*n)/64;%通过设定非边缘点的比例来确定高门限lowThresh=ThresholdRatio*highThresh;%设置低门限为高门限乘以比例因子thresh=lowThresh,highThresh;%下面进行非极大抑制%大于高门限的点归于强边缘图像%小于低门限的点归于弱边缘图像idxStrong=;for dir=1:4idxLocalMax=cannyFindLocalMaxima(dir,ax,ay,mag);idxWeak=idxLocalMax(mag(idxLocalMax)lowThresh);e(idxWeak)=1;idxStrong=idxStrong;idxWeak(mag(idxWeak)highThresh);endrstrong=rem(idxStrong-1,m)+1;%rem是求余数cstrong=floor(idxStrong-1)/m)+1;%向-取整e=bwselect(e,cstrong,rstrong,8);%通过形态学算子将两幅图像的边缘进行连接