作为图像边缘检测方式的一种,其的结果是单像素边缘。
在OpenCV图像库函数中,它的函数形式为:
参数说明:
image 表示输入的图像数据,单通道灰度图;
edges 表示输出的图像边缘数据信息;
threshold1与threshold2 表示两个阈值,大的阈值控制着边缘信息的分割,小的阈值控制着边缘信息的连接;
aperture_size 表示图像平滑的尺寸大小。
算法具体的流程可以如下:
1)输入图像的平滑处理。
2)计算图像的梯度信息。
3)计算图像的梯度幅值信息。
4)对梯度幅值进行非极大值抑制,具体算法思想在于观察当前点的梯度幅值与邻域关系的比较,若是最大的,那么此点为边缘点,若不是最大的,此点非边缘点。
具体判断条件(假设gx、gy为X方向与Y方向的梯度值,gTmp当前点的梯度幅值,g1,g2,g3,g4分别为确定周围邻域哪几个像素点的梯度值)
若abs(gy)>abs(gx) 表示Y方向梯度值大于X方向的梯度值,此时差值参数weight=abs(gx)/abs(gy)
再者若gx*gy>0,那么g1,g2,g3,g4与当前点的关系为:
再者若gx*gy<0,那么g1,g2,g3,g4与当前点的关系为:
若abs(gy)>abs(gx) 表示Y方向梯度值大于X方向的梯度值,此时差值参数weight=abs(gy)/abs(gx)
再者若gx*gy>0,那么g1,g2,g3,g4与当前点的关系为:
再者若gx*gy<0,那么g1,g2,g3,g4与当前点的关系为:
此时根据g1-g4差值处理,gTmp1=g1*weight+(1-weight)*g2;
gTmp2=g3*weight+(1-weight)*g4;
如果当前点的gtmp>gTmp1&>mp>gTmp2,认为此点为边缘点,否则不是边缘点。
5)边缘点连接,具体算法。
1. 高阈值确定;
梯度幅值直方图量化。
根据直方图个数占用像素的比例确定梯度幅值的高阈值。
2. 低阈值确定;
根据高阈值与高低阈值的比例确定低阈值。
3. 边缘点追踪;
6)实验效果,以lina图像为例,边缘检测效果如下: