canny边缘检测,相对于sobel是较为复杂的一种检测算法,也是迄今为止最优秀的一种边缘检测算法,但是不可否认,它也带来了大量的运算。
canny分四步:
1.对灰度图进行高斯滤波 (很简单)
2.. 求出梯度的幅值图像和角度图像(一般用sobel求,简单)
3.对梯度幅值图形进行非最大值抑制,并进行双阈值处理。(难)
4.连接分析来检测并连接边缘。(很难)
1、高斯滤波。
使用二维高斯公式,产生高斯滤波模版。公式就不写,源码里会有。然后用模版和图像进行卷积。这一步很简单,就不多说了
2、求梯度的赋值和角度
用sobel算子,x方向为[-1,-2,-1; y方向的算子为x方向的转置。然后分别用这两个算子和图像做卷积。然后用公式 A=sqrt(x.^2+y.^2)就是梯度幅值图了。
0, 0, 0
1, 2, 1 ]
然后是求角度,没一点的角度为arctan[y/x],求出梯度角度图;
3、利用求出的梯度角度图,把各个梯度分别划分到水平,垂直,45°,-45°,四个方向上。然后把赋值图按所划分的四个方向,分别同邻近的两个点比较,若为最大值则保留,若不是,则变为0;这样就得到非最大值抑制图,然后设置一个大阈值和一个小阈值,再用小阈值图减去大阈值图。得到阈值图。
4、在大阈值图中定位下一个非0像素P;在小阈值图中用8连通的方式,连接到P,如此递归,连接所有连线。
下面是源码
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%函数功能:canny边缘检测%%%%%%%%%%%%%%%%%%%%%
%%作者:张小胖疯了%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%时间:2013.9.28%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;close all; clc;
src=imread('D:\Documents\Desktop\lenna.JPG'); %读入图形
[m,n,q]=size(src);
src_gray=my_gray(src); %变为灰度图