边缘检测原理和步骤:
在实际情况中理想的灰度阶跃及其线条边缘图像是很少见到的,同时大多数的传感器件具有低频滤波特性,这样会使得阶跃边缘变为斜坡性边缘,看起来其中的强度变化不是瞬间的,而是跨越了一定的距离。这就使得在边缘检测中首先要进行的工作是滤波。
1)滤波:边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感,因此必须采用滤波器来改善与噪声有关的边缘检测器的性能。常见的滤波方法主要有高斯滤波,即采用离散化的高斯函数产生一组归一化的高斯核,然后基于高斯核函数对图像灰度矩阵的每一点进行加权求和(卷积)。
2)增强:增强边缘的基础是确定图像各点邻域强度的变化值。增强算法可以将图像灰度点邻域强度值有显著变化的点凸显出来。在具体编程实现时,可通过计算梯度幅值来确定。
3)检测:经过增强的图像,往往邻域中有很多点的梯度值比较大,而在特定的应用中,这些点并不是我们要找的边缘点,所以应该采用某种方法来对这些点进行取舍。实际工程中,常用的方法是通过阈值化方法来检测。
opencv中的canny:
1. 用高斯滤波器平滑图像.
2. 用一阶偏导有限差分计算梯度幅值和方向.
3. 对梯度幅值进行非极大值抑制 .
4. 用双阈值算法检测和连接边缘
参考链接: http://blog.csdn.net/liuzhuomei0911/article/details/51345591
个人小结:
1、将图像与高斯函数做卷积
通过步骤5可以尝试多个sigma。
2、对图像中每个像素求计算局部边缘的法向量(或者求梯度方向)
从上面的算子可以计算出某个像素点的x方向的梯度值和y方向的梯度值(近似差分)。如下图:
计算可得每个像素点的梯度值,也是一个矩阵的形式。
将梯度方向归一化到下图的四个角度。
3、非极大值抑制(抑制的是非极大梯度值)
在上图中蓝色的线代表c点的梯度方向,因为极值肯定存在在梯度方向上,所以直接结算dTmp1和dTmp2既可以得出c是否为极大值点。dTmp1和dTmp2的梯度值可以通过线性插值计算。
完成非极大值抑制后,会得到一个二值图像,非边缘的点灰度值均为0,可能为边缘的局部灰度极大值点可设置其灰度为128。
到此为止已经可以看到边缘的样子了(差不多等同于sobel边缘检测),以上计算的非零点都是候选点,但是检测结果还是包含了很多由噪声及其他原因造成的假边缘。因此还需要进一步的处理。
4、对边缘图像做滞后阈值化处理
双阈值做法是将候选像素点拼接成轮廓,轮廓的形成时对这些像素运用滞后性阈值,设置高低阈值(通过信噪比确定)
作用:高阈值排除噪声点,得到比较信任度比较高的轮廓,此时会孤立噪声点,低阈值链接细轮廓,通过多次迭代,得到稳定的轮廓。