边缘检测算子

figure 1 边缘检测

Edges are points where there is a boundary between two image regions. In general, an edge can be of almost arbitrary shape, and may include junctions. In practice, edges are usually defined as sets of points in the image which have a strong gradient magnitude.

一般有两种方法可以计算出这些变化率很快的点。

  1. 导数:连续函数上某点斜率,导数越大表示变化率越大,变化率越大的地方就越是“边缘”,但是在计算机中不常用,因为在斜率90度的地方,导数无穷大,计算机很难表示这些无穷大的东西。
  2. 微分:连续函数上x变化了dx,导致y变化了dy,dy值越大表示变化的越大,那么计算整幅图像的微分,dy的大小就是边缘的强弱了。
    微分与导数的关系:dy = f ‘(x) dx

在连续函数里叫微分。由于图像是离散的,这里叫差分,和微分是一个意思,也是求变化率。

差分的定义:f ‘(x) = f(x + 1) – f(x),用后一项减前一项。按先后顺序排列 f ‘(x) = -f(x) + f(x + 1),提出系数 [-1, 1] 作为滤波模板,跟原图 f(x) 做卷积运算就可以检测边缘了

Sobel 边缘检测算子

用 f ‘(x) = f(x + 1) – f(x – 1) 近似计算一阶差分

排好序:[-1 * f(x-1),0 * f(x),1 * f(x+1)]
提出系数:[-1, 0, 1]

所以模板 [-1, 1] 被改造成了 [-1, 0, 1]
二维情况下就是

-1, 0, 1
-1, 0, 1
-1, 0, 1

这个就是 Prewitt 边缘检测算子了。

f(x-1, y-1),  f(x, y-1),  f(x+1, y-1)
f(x-1, y),    f(x, y),    f(x+1, y)
f(x-1, y+1),  f(x, y+1),  f(x+1, y+1)

中心点 f(x, y) 是重点考虑的,它的权重应该多一些,所以改进成下面这样的

-1, 0, 1
-2, 0, 2
-1, 0, 1

这就是 Sobel 边缘检测算子,偏 x 方向。(类似二元函数的偏导数,偏x,偏y)
同理可得

-1, -2, -1
 0,  0,  0
 1,  2,  1

是 sobel 偏 y 方向的算子。

分别计算偏 x 方向的 Gx,偏 y 方向的 Gy,求绝对值,压缩到 [0, 255] 区间,即 G(x, y) = Gx + Gy 就是 sobel 边缘检测后的图像了

Canny 边缘检测算子
canny计算过程
  1. 高斯滤波器平滑图像。
  2. 一阶差分偏导计算梯度值和方向。
  3. 对梯度值不是极大值的地方进行抑制。
  4. 用双阈值连接图上的联通点。

通俗说一下,

  1. 用高斯滤波主要是去掉图像上的噪声。
  2. 计算一阶差分,OpenCV 源码中也是用 sobel 算子来算的。
  3. 算出来的梯度值,把不是极值的点,全部置0,去掉了大部分弱的边缘。所以图像边缘会变细。
  4. 双阈值 t1, t2, (t1 <= t2)
    大于 t2 的点肯定是边缘
    小于 t1 的点肯定不是边缘
    在 t1, t2 之间的点,通过已确定的边缘点,发起8领域方向的搜索(广搜),图中可达的是边缘,不可达的点不是边缘。
    最后得出 canny 边缘图。
Laplace 边缘检测算子

拉普拉斯是用二阶差分计算边缘的,看连续函数的情况下
在一阶微分图中极大值或极小值处,认为是边缘。
在二阶微分图中极大值和极小值之间与 x 轴相交的点,被认为是边缘。

two advantages:

  1.  二阶微分关心的是图像灰度的突变而不强调灰度缓慢变化的区域,对边缘的定位能力更强。
  2. Laplace算子是各项同性的,即具有旋转不变性,在一阶微分里,我们是用|dx|+|dy|来近似一个点的梯度的,当图像旋转一个角度时,这个值就变化了,但对于Laplace算子来说不管图像怎么旋转,得到的响应是一样的。

tow disadvantages:

  1. 没有了边缘的方向信息
  2. 双倍加强了噪声的影响

拉普拉斯算子推导:
一阶差分:f ‘(x) = f(x) – f(x – 1)
二阶差分:f ‘(x) = (f(x + 1) – f(x)) – (f(x) – f(x – 1))
化简后:f ‘(x) = f(x – 1) – 2 f(x)) + f(x + 1)
提取前面的系数:[1, -2, 1]

二维的情况下,同理可得
f ‘(x, y) = -4 f(x, y) + f(x-1, y) + f(x+1, y) + f(x, y-1) + f(x, y+1)
提取各个系数,写成模板的形式

0,  1, 0
1, -4, 1
0,  1, 0

考虑两个斜对角的情况

1,  1, 1
1, -8, 1
1,  1, 1

这就是拉普拉斯算子,与原图卷积运算即可求出边缘。

三个算子区别

sobel 产生的边缘有强弱,抗噪性好(一阶算子)
canny 产生的边缘很细,可能就一个像素那么细,没有强弱之分(一阶算子)

laplace 对边缘敏感,可能有些是噪声的边缘,也被算进来了(二阶算子)

下面三张图分别是 sobel,canny,laplace 结果图。

                                                           sobel算子
                                                           canny算子
                                                   laplace算子多阈值

LOG算子

1980年,Marr 和 Hildreth 提出将 Laplace 算子与高斯低通滤波相结合,提出了LOG(Laplace and Guassian)算子。

步骤如下:

  1. 对图像先进行高斯滤波(G × f),再进行Laplace算子运算Δ(G × f)
  2. 保留一阶导数峰值的位置,从中寻找Laplace过零点
  3. 对过零点的精确位置进行插值估计。

                                   由上图可以看出,高斯滤波之后边缘信息才突显出来。

                                                微分算子与卷积算子的次序可以交换。

LOG算子如下:

根据sigma的不同以及 3 sigma 原则可以建立不同的模板,sigma 是一个尺度参数,在图像处理中引入尺度以及建立多尺度空间是一个重要的突破,sigma 越大,图像越模糊滤除噪声效果越好,sigma 越小,效果越差。

常用模板如下:

通过一些数学技巧,可以简化 LOG 的计算——便得到了 DOG 算子。

DOG算子

二维高斯对 sigma 求导:

上面我们已经得到:

可以看出:

由导数定义:

所以,

变形一下得到:

右边比LOG算子只是多了一个系数,在实际应用中不影响。

我们定义:

当我们用DOG算子代替LOG算子与图像卷积的时候:

近似的LOG算子值的选取:

当使用这个值时,可以保证 LoG 和 DoG 的过零点相同,只是幅度大小不同。

这样,我们只要对图像进行两次高斯平滑再将结果相减就可以近似得到LOG作用于图像的效果了!

Share this to:

发表评论

电子邮件地址不会被公开。 必填项已用*标注