边缘检测(edge detection)_Sobel导数 Laplace算子 Canny边缘检测

来源:互联网 发布:warframe淘宝买装备 编辑:程序博客网 时间:2024/06/05 20:35

边缘检测

什么叫边缘?

"You can easily notice that in an edge, the pixel intensity changes in a notorious way." 

边缘就是像素亮度剧烈变化的地方。

怎么检测边缘?

"A good way to express changes is by using derivatives. A high change in gradient indicates a major change in the image."

导数就用来描述变化,梯度变化越大图像改变越多。


一:Sobel算子

(一)理论依据:

假设我们有一副有一维图像,图像中灰度值的跳跃点就是边缘,如图1所示。


图1 一维图像中的边缘为“跳跃点”



图2 对一维图像求导,最高点为边缘点

"locating pixel locations where the gradient is higher than its neighbors (or to generalize, higher than a threshold)."

梯度比邻域像素或者特定阈值大的像素点就是边缘。

(二):Sobel算子

在水平x方向求导:


在竖直y方向求导:

梯度的运算和近似运算公式:

(运算公式)

(近似公式)

也即是说检测过程只需要对分别进行了x和y方向求导的输出图像用近似梯度相加合并得到最终图像。


二:Laplace算子

对上图2再求导得到图3所示的二阶导数图像:

图3 二阶导数

可以看到现在我们一阶导数检测边缘为边缘的地方像素变为0 ,所以我们可以认为从非零到0是一个边缘(图3的左上部分,亮度由暗变亮)同时0到非零是一个边缘(图3 的右下部分,原图是亮度亮由暗)。

也就是说拉普拉斯算子可以检测出双边缘!

【这里推荐一篇博客,可以对这个有较好的解释:http://blog.csdn.net/xiaowei_cqu/article/details/7829481】


三:Canny边缘检测

(一)1996年由John F. Canny提出的Canny边缘检测,是边缘检测算法中的最优良算法。

Canny算法旨在满足三个特性:

低错率:对边缘做出检测,并且不把不是的检测为边缘

高定位性:检测出的边缘和实际边缘位置的距离最小

小响应性:边缘最好只被标识一次

(二)Canny算法的步骤:

1:高斯平滑消去噪声

2:计算梯度的强度(幅值)和方向

A:用一下公式运行一次Sobel算子

B:用一下公式计算幅值和方向

最好能将角度控制在0,45,90,135度左右

3:非极大值抑制

这样除去了不是边缘的像素,留下的是候选的边缘

4:滞后阈值: 最后一步,Canny 使用了滞后阈值,滞后阈值需要两个阈值(高的和低的阈值):
1:如果某一像素位置的梯度超过 高阈值, 该像素被保留为边缘
b.如果某一像素位置的梯度小于 低阈值, 该像素被排除
c.如果某一像素位置的梯度在两个阈值之间,该像素仅仅在连接到一个高于高阈值的像素时被保留。
Canny 推荐的高低阈值比在 2:1 到3:1之间。

0 0