1)高斯核实现
上式为离散化的一维高斯函数,确定参数就可以得到一维核向量。
上式为离散化的二维高斯函数,确定参数就可以得到二维核向量。
注意1:关于参数Sigma的取详见上篇博文。canny边缘检测 c语言
注意2:在求的高斯核后,要对整个核进行归一化处理。
2)图像高斯滤波
对图像进行高斯滤波,听起来很玄乎,其实就是根据待滤波的像素点及其邻域点的灰度按照一定的参数规则进行加权平均。这样可以有效滤去理想图像中叠加的高频噪声。
通常滤波和边缘检测是矛盾的概念,抑制了噪声会使得图像边缘模糊,这回增加边缘定位的不确定性;而如果要提高边缘检测的灵敏度,同时对噪声也提高了灵敏度。实际工程经验表明,高斯函数确定的核可以在抗噪声干扰和边缘检测精确定位之间提供较好的折衷方案。这就是所谓的高斯图像滤波,具体实现代码见下文。
关于图像灰度得梯度可使用一阶有限差分来进行近,这样就可以得图像在x和y方向上偏导数的两个矩阵。常用的梯度算子有如下几种:
1)Roberts算子
上式为其x和y方向偏导数计算模板,可用数学公式表达其每个点的梯度幅为:
2)Sobel算子
上式三个矩阵分别为该算子的x向卷积模板、y向卷积模板以及待处理点的邻域点标记矩阵,据此可用数学公式表达其每个点的梯度幅为:

3)Prewitt算子
和Sobel算子原理一样,在此仅给出其卷积模板。

4)Canny算法所采用的方法
在本文实现的Canny算法中所采用的卷积算子比较简单,表达如下:
其x向、y向的一阶偏导数矩阵,梯度幅以及梯度方向的数学表达式为:

求出这几个矩阵后,就可以进行下一步的检测过程。
图像梯度幅矩阵中的元素越大,说明图像中该点的梯度越大,但这不不能说明该点就是边缘(这仅仅是属于图像增强的过程)。在Canny算法中,非极大抑制是进行边缘检测的重要步骤,通俗意义上是指寻找像素点局部最大,将非极大点所对应的灰度置为0,这样可以剔除掉一大部分非边缘的点(这是本人的理解)。

图1 非极大抑制原理
根据图1 可知,要进行非极大抑制,就首先要确定像素点C的灰度在其8邻域内是否为最大。canny边缘检测 c语言图1中蓝色的线条方向为C点的梯度方向,这样就可以确定其局部的最大肯定分布在这条线上,也即出了C点外,梯度方向的交点dTmp1和dTmp2这两个点的也可能会是局部最大。因此,判断C点灰度与这两个点灰度大小即可判断C点是否为其邻域内的局部最大灰度点。如果经过判断,C点灰度小于这两个点中的任一个,那就说明C点不是局部极大,那么则可以排除C点为边缘。这就是非极大抑制的工作原理。
作者认为,在理解的过程中需要注意以下两点:
2)梯度方向垂直于边缘方向。
但实际上,我们只能得到C点邻域的8个点的,而dTmp1和dTmp2并不在其中,要得到这两个就需要对该两个点两端的已知灰度进行线性插,也即根据图1中的g1和g2对dTmp1进行插,根据g3和g4对dTmp2进行插,这要用到其梯度方向,这是上文Canny算法中要求解梯度方向矩阵Thita的原因。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33926-2.html
后面少了一部分