canny边缘检测算法

今天笔试遇到的,居然没有仔细了解,幸运的是蒙对了。今天补补相关知识。

步骤

1. 高斯模糊

2. 计算梯度大小和方向

3. 边梯度非极大值抑制,细化边

4. 双阈值分离强弱边缘

5. 连接弱边缘,去掉噪声

高斯模糊

为什么

边缘和噪声同属于高频信号,但是对高斯模糊的响应是不同的。噪声通常为点噪声,相比于边缘的线的高频信号,高斯模糊后被更大程度抑制。并且虽然边缘被抑制,在后期连接弱边缘时,仍可以和强边缘连接从而强化。但是噪声因为其孤立,不会连接到周围的强边缘。

怎么做

用5*5的高斯核,方差为1.2,对图像卷积。高斯核方差越大,噪声抑制越明显,边缘越不容易检测。

计算梯度大小和方向

为什么

边缘检测最重要的就是定义边缘的特征。灰度梯度大小是边缘的最显著特征。设置灰度梯度大小阈值可以提取初始边界。

怎么做

常常使用Sobel算子来计算梯度。

x方向的Sobel算子:

Sobel(\vec{x})=\begin{pmatrix} -1 & 0 &1 \\ -2 & 0 & 2\\ -1 & 0 & 1 \end{pmatrix}

同理,y方向Sobel算子:

Sobel(\vec{y})=\begin{pmatrix} 1 & 2 &1 \\ 0 & 0 & 0\\ -1 & -2 & -1 \end{pmatrix}

x方向比较左右灰度,y方向比较上下梯度。至于哪一侧为正不重要,因为梯度的二范数是一致的。

G=\sqrt{G_x^2+G_y^2}

其中G_x, G_y就是Sobel计算卷积后的结果。

梯度方向:\theta=arctan(\frac{G_y}{G_x})

将两方向梯度相加,得到检测边缘。

非极大值抑制

为什么

在边缘处可能有若干像素,这些像素的灰度梯度都很大,但是我们只需要一条边缘,边缘只要一个像素。为了能细化边缘,选择的规则为非极大值抑制,即让梯度为非极大值的边缘梯度置为0。

怎么做

首先确定当前点的灰度梯度方向。然后在该梯度方向上,计算当前点的四周和该梯度方向相交的边界的位置(图中为A和C),利用灰度的梯度插值,计算两侧位置的灰度梯度。将该位置灰度梯度和两侧位置灰度梯度比较,如果不是极大值,则将该位置灰度梯度置0。

双阈值

为什么

为了去掉噪声以及不显著的边界,可以手动设置阈值,让大于阈值的取为强边界,小于阈值的为弱边界。

怎么做

直接判断梯度是否大于阈值即可。手动调整直到最关注的边界为强边界。

连接弱边缘

为什么

弱边缘可能因为其灰度对比度不高,但是和强边缘实际上是相连的,为了尽可能让边界连续,将弱边缘和强边缘连接起来。

怎么做

定义临接像素为周围八个像素。如果邻接像素存在强边缘且该处为弱边缘,则令其为强边缘。循环即可。也可以用dfs,将检测到强边缘四周的弱边缘入栈,然后弱边缘不断出栈,强化,四周弱边缘入栈,直到栈为空。

连接完毕,将仍是弱边缘的边缘舍弃,其中包括了噪声数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值