今天笔试遇到的,居然没有仔细了解,幸运的是蒙对了。今天补补相关知识。
步骤
1. 高斯模糊
2. 计算梯度大小和方向
3. 边梯度非极大值抑制,细化边
4. 双阈值分离强弱边缘
5. 连接弱边缘,去掉噪声
高斯模糊
为什么
边缘和噪声同属于高频信号,但是对高斯模糊的响应是不同的。噪声通常为点噪声,相比于边缘的线的高频信号,高斯模糊后被更大程度抑制。并且虽然边缘被抑制,在后期连接弱边缘时,仍可以和强边缘连接从而强化。但是噪声因为其孤立,不会连接到周围的强边缘。
怎么做
用5*5的高斯核,方差为1.2,对图像卷积。高斯核方差越大,噪声抑制越明显,边缘越不容易检测。
计算梯度大小和方向
为什么
边缘检测最重要的就是定义边缘的特征。灰度梯度大小是边缘的最显著特征。设置灰度梯度大小阈值可以提取初始边界。
怎么做
常常使用Sobel算子来计算梯度。
x方向的Sobel算子:
同理,y方向Sobel算子:
x方向比较左右灰度,y方向比较上下梯度。至于哪一侧为正不重要,因为梯度的二范数是一致的。
其中就是Sobel计算卷积后的结果。
梯度方向:
将两方向梯度相加,得到检测边缘。
非极大值抑制
为什么
在边缘处可能有若干像素,这些像素的灰度梯度都很大,但是我们只需要一条边缘,边缘只要一个像素。为了能细化边缘,选择的规则为非极大值抑制,即让梯度为非极大值的边缘梯度置为0。
怎么做
首先确定当前点的灰度梯度方向。然后在该梯度方向上,计算当前点的四周和该梯度方向相交的边界的位置(图中为A和C),利用灰度的梯度插值,计算两侧位置的灰度梯度。将该位置灰度梯度和两侧位置灰度梯度比较,如果不是极大值,则将该位置灰度梯度置0。
双阈值
为什么
为了去掉噪声以及不显著的边界,可以手动设置阈值,让大于阈值的取为强边界,小于阈值的为弱边界。
怎么做
直接判断梯度是否大于阈值即可。手动调整直到最关注的边界为强边界。
连接弱边缘
为什么
弱边缘可能因为其灰度对比度不高,但是和强边缘实际上是相连的,为了尽可能让边界连续,将弱边缘和强边缘连接起来。
怎么做
定义临接像素为周围八个像素。如果邻接像素存在强边缘且该处为弱边缘,则令其为强边缘。循环即可。也可以用dfs,将检测到强边缘四周的弱边缘入栈,然后弱边缘不断出栈,强化,四周弱边缘入栈,直到栈为空。
连接完毕,将仍是弱边缘的边缘舍弃,其中包括了噪声数据。