完成非极大抑制后,会得到一个二图像,非边缘的点灰度均为0,可能为边缘的局部灰度极大点可设置其灰度为128。根据下文的具体测试图像可以看出,这样一个检测结果还是包含了很多由噪声及其他原因造成的假边缘。因此还需要进一步的处理。
Canny算法中减少假边缘数量的方法是采用双阈法。选择两个阈(关于阈的选取方法在扩展中进行讨论),根据高阈得到一个边缘图像,这样一个图像含有很少的假边缘,但是由于阈较高,产生的图像边缘可能不闭合,未解决这样一个问题采用了另外一个低阈。
在高阈图像中把边缘链接成轮廓,当到达轮廓的端点时,该算在断点的8邻域点中寻找满足低阈的点,再根据此点收集新的边缘,直到整个图像边缘闭合。
以上即为整个Canny边缘检测算法的原理分析,接下来我们进行VC下的算法实现和效果分析。
由于本文主要目的在于学习和实现算法,而对于图像读取、视频获取等内容不进行阐述。因此选用OpenCV算法库作为其他功能的实现途径(关于OpenCV的使用,作者将另文表述)。首先展现本文将要处理的彩片。

图2 待处理的图像
编程时采用上文所描述的第二种方法来实现图像的灰度化。其中ptr数组中保存的灰度化后的图像数据。具体的灰度化后的效果如图3所示。
图3 灰度化后的图像
根据上面所讲的边缘检测过程,下一个步骤就是对图像进行高斯滤波。可根据之前博文描述的方法获取一维或者二维的高斯滤波核。因此进行图像高斯滤波可有两种实现方式,以下具体进行介绍。
首先定义该部分的通用变量:
doublenSigma=0.4;//定义高斯函数的标准差
intnWidowSize=12*ceil(3*nSigma);//定义滤波窗口的大小
intnCenter=(nWidowSize)/2;//定义滤波窗口中心的索引
两种方法都需要用到的变量:
intnWidth=OpenCvGrayImage->width;//获取图像的像素宽度
intnHeight=OpenCvGrayImage->height;//获取图像的像素高度
unsignedchar*nImageData=newunsignedchar[nWidth*nHeight];//暂时保存图像中的数据
unsignedchar*pCanny=newunsignedchar[nWidth*nHeight];//为平滑后的图像数据分配内存
double*nData=newdouble[nWidth*nHeight];//两次平滑的中间数据
for(intj=0;j<nHeight;j)//获取数据
{
for(i=0;i<nWidth;i)
nImageData[j*nWidthi]=(unsignedchar)OpenCvGrayImage->imageData[j*nWidthi];
}
3.2.1 根据一维高斯核进行两次滤波
1)生成一维高斯滤波系数
//////////////////////生成一维高斯滤波系数/////////////////////////////
double*pdKernal_1=newdouble[nWidowSize];//定义一维高斯核数组
doubledSum_1=0.0;//求和,用于进行归一化
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33926-3.html
定期存款100亿