写这篇文章的目的是解释清楚图像求导和一阶二阶算子之间的关系,以及那些花样百出的边缘检测算子是怎么来的,为什么是那个样子,有什么样的检测效果,优点和缺点是什么,该如何使用,不喜欢看推导和原理的同学可以直接跳到下一篇《边缘检测算子与及效果对比》直接看结果。
一、图像求导原理
要理解图像的边缘,要先从图像的导数开始,我们知道连续函数f(x,y)的偏导数定义为:
(1)
以求x的偏导为例,这个公式有三层含义:
1. 首先要有一个方向,x或y方向
2. 其次要在一个足够小的范围内,这个范围小到∆x要接近于0,这是连续函数能定义出的最小范围,一个接近于0的范围
3. 分子是对两个函数值做减法,分母是这个足够小的距离,除一下计算的是一个变化率
合起来就是,在一个指定的方向上,取一个足够小的范围,计算这个范围内的函数值变化了多少。
公式(1)只给出了x和y两个方向,但是我们知道,真实的世界中不可能只有两个方向,所以有了梯度的概念,梯度指的是函数沿任一指定方向的变化率,为了表达“沿任一指定方向”这个概念,梯度中定义了两个余弦来描述它,余弦不是重点,方向才是重点,直接把连续函数求导的定义推导到离散函数上。
对于一个图像来说,描述一个图像就是按照x和y进行的,所以图像求导的方向是现成的,图像的最小距离单位就是1,相当于∆x和∆y都是1,极限可以扔了,图像的函数值就是亮度值,公式(1)就变成了分别沿x方向和y方向对相邻像素做减法,其公式如(2)所示:
(2)
图像还有两个对角线方向,所以常用的图像求导方向有4个,水平、垂直和两个对角线。在图像中,梯度的“沿任一指定方向”已经包含在算子里面了,减法的那个方向就是梯度方向。
图像领域通常使用的是梯度的幅值,这就要把多个方向的梯度融合起来,计算梯度幅值的方法一般是计算欧式距离,如公式(3)所示,可以理解为两个方向梯度的混合代表最终的梯度幅值,但是为了降低计算复杂度,很多时候是用绝对值相加的方法,如公式(4)所示:
(3)
(4)
还有一种采用无穷范数衡量梯度幅值的方法,可以理解为哪个方向的梯度值大,就采用哪个方向的,如公式(5)所示:
(5)
实际使用的时候看需求,一般是在(4)和(5)之间做选择,接下来是二阶导。
二阶导可以理解为对一阶导再求一次导数,以x方向为例(y方向同理)即:
(6)
以x轴方向的求导为例,一阶导定义了一个[1,-1]的算子,二阶导定义了一个[1,-2,1]的算子,用这两个算子对图像做卷积,就可以获得图像求导的结果。
二、图像求导效果测试
用一个简单的黑白图像来做个测试,看一下在图像边缘发生了什么。图1中的(a)是输入的测试图像,宽度300,高度512,(b)中红色标记出了要观察数据位置。
对(b)中的红色位置分别用水平方向一阶导[1,-1]和二阶导[1,-2,1]做卷积,得到的效果如图2所示:
图2 中(a)的横坐标轴显示了取样位置的坐标,纵轴是取样的亮度值,输入图白色的部分亮度接近于1,黑色的部分亮度接近于0,白变黑或黑变白的时候是有一个过渡的,就是(a)中下降和上升部分,此外输入图中还有一点点噪声。从(b)图可以看出,一阶导显示的是亮度变化的速度,无论亮度是增加还是减少,其增减的速度都有一个峰值,速度达到峰值后逐渐减小,亮度不变区域的一阶导接近于0。(c)图是二阶导,二阶导是一阶导的导数,它描述的是亮度变化速度的快慢,也就是亮度变化的加速度,图像的亮度不可能一直沿某个方向增加或者是减少,速度达到最大后必定要转向,二阶导描述的就是这种转向的变化,在速度转向的时候,加速度过零点给速度另一个方向的增量,所以二阶导会产生双边缘效应,它描述了进入边缘和离开边缘的过程。此外(b)和(c)里面还有一些小波动,这是噪声带来的影响。
图3给出了完整的一阶导和二阶导的浮雕效果,就是对卷积结果加了0.5,把负数部分也一起显示在了图像上,偏白的边缘是正数部分,偏黑的边缘是负数部分。
从浮雕图也能看出一阶导和二阶导的区别,一阶导是描述梯度上升还是下降的过程,二阶导是描述亮度转向的位置。所以目前应用基本上是一阶导做边缘检测,二阶导做锐化。