}
// Canny算子
void Canny(LPBYTE pGray, SIZE sz, double sigma, double dRatLow, double dRatHigh, LPBYTE pResult) { //经过高斯滤波后的图像
LPBYTE pGaussSmooth;
pGaussSmooth=new unsigned char[sz.cx*sz.cy]; //x方向导数的指针 int *pGradX;
pGradX = new int[sz.cx*sz.cy];
//y方向
int *pGradY;
pGradY = new int[sz.cx*sz.cy];
//梯度的幅度
int *pGradMag;
pGradMag = new int[sz.cx*sz.cy];
//对原图高斯滤波
GaussianSmooth(sz,pGray,pGaussSmooth,sigma);
//计算方向导数和梯度的幅度
Grad(sz,pGaussSmooth,pGradX,pGradY,pGradMag);
//应用非最大抑制
NonmaxSuppress(pGradMag,pGradX,pGradY,sz,pResult);
//应用Hysteresis,找到所有边界
Hysteresis(pGradMag,sz,dRatLow,dRatHigh,pResult); delete[] pGradX; pGradX = NULL; delete[] pGradY; pGradY = NULL; delete[] pGradMag; pGradMag = NULL; delete[] pGaussSmooth;
pGaussSmooth = NULL; }
void OnCanny() {
if (! m_fOpenFile){
return; }
m_fDone = TRUE;
RGBToGray(szImg, aRGB, aGray, BPP); Canny(aGray,szImg,0.1,0.9,0.76,aBinImg); ShowGrayImage(\} 演示图像:
Sobel边缘检测后的图像
Canny边缘检测后的图像
根据上图对照,明显可以得出canny 检测比sobel检测的效果更好。 三、结束语
1、sobel算子根据像素点上下、左右邻点灰度值加权值,在边缘处打到极大值这一现象检测边缘。对噪声具有平滑作用,提供较为精确的边缘方向信息,但是边缘定位精度不够高。当对精度要求不是很高的时候,是一种较为常用的边缘检测方法。
2、canny算子是边缘检测中最具有代表的一种局部极值边缘检测。无论从视觉效果还是客观评价来看,canny算子提取的边缘线性连接程度较好,对此类边缘提取比较完整,边缘线很细腻。
参考文献
[1] 数字图像处理《第三版》中文版(Rafael C.Ganzalez), 2014.04(7)
[2] 吴术路,WU Shu-lu.基于Sobel算子图像边缘检测的MATLAB实现,2010,06(19) [3] 王瀚闻,基于索贝尔算子的高分辨率遥感影像分割技术研究,内蒙古大学生命科学学院2000年,1674-098X(2012)08(a)-0018-01
[4] MaIIatS,ZhongS. Characterization of SignaIs from MuItiscaIe Edges[J].IEEE Trans on
PAMI,1992,14(7):710-732
[5] MeerP,Georgescu B. Edge Detection with Embedded Confidence[J].IEEE Trans on PAMI,2001,23(120):1351-1365.