经典的边缘提取算法中有一类算法是基于设计边缘提取算子(或者也可以叫卷积模板),然后经过阈值处理得到二值化的边缘图,下面就具体介绍这种思路相关的内容。
边缘提取(一):传统的边缘提取算子(1)
传统的边缘提取算子包括sobel、prewit、robert、LoG等,下面一一介绍:
1. Sobel,prewitt,robert算子
sobel prewitt robert
sobel算子相比于[-1 0 1]这种简单的水平梯度算子,还具有一定的平滑作用,有助于去除噪声,prewitt和sobel算子很像,但是sobel算子的卷积考虑了不同位置的权重。而robert算子求取的是对角线方向的。具体不做详细介绍了。Matlab实现代码如下:
2. LOG(拉普拉斯+高斯滤波)
首先介绍一下拉普拉斯算子是一个二阶微分算子,在笛卡尔坐标系中就是所有非混合二阶偏导数:
具体到图像坐标系(x-y)中(x代表行,y代表图像列):
离散化之后的表示为(间隔为1):(二阶差分)
(离散系统到连续系统是通过采样保持器,常用的是零阶保持器,连续系统到离散系统则是通过间隔采样得到的,从s域变到z域的变化有双线性变化等方法,差分方程与Z域有直接的联系,具体怎么样需要用到控制数学里面的一些东西,这里偷个懒就不详细介绍了,想要深入了解的往这个方向查资料就行了):
对应卷积模板为:
梯度是原图的一阶导数,代表的是像素值的变化速度,而拉普拉斯算子是二阶导数,代表着梯度的变化速度,这二者其实都可以用来确定边缘,具体例子我们可以看下图:
(原图)
下面的折线图取自原图第五行的处理结果,如果用一阶导数求出的梯度,则会有两个峰值分别对应上下边沿,而如果用二阶导的话,则会对应的有四个峰值,原因是分别经历了两次剧烈的升降变化,而峰值极大值处,如果在连续系统中,二阶导为0。
(从左到右分别为第五行灰度,一阶差分,二阶差分结果)
所以如果用二阶导来定位边缘的话,正确的方式应该是求取下图中两个黄点中间的位置,
由于图像坐标是离散的,所以只能近似逼近。但是几个峰值的位置其实也是靠近边缘的,有时候为了简化运算,也可以直接用二阶求导之后的值来做边缘提取,但是边缘定位的就不是很准了。上述实验的代码如下:
差分之后的结果(左:一阶 右:二阶)
二值化之后的结果(左:一阶 右:二阶)
为了去除噪声的影响,在用拉普拉斯算子对图像进行卷积之前,可以先用高斯对图像进行滤波,同样也是卷积操作:
而图像的卷积等价于频域的乘积,这样我们就可以把高斯卷积和laplace卷积合起来,就得到了LoG算子,具体解算步骤就是:
(公式详细推导来自于https://blog.csdn.net/touch_dream/article/details/62237018)
l 然后离散化得到指定大小的卷积模板,常用的是5*5的模板
(要具体了解离散化的过程,可以参考这篇博客: https://blog.csdn.net/gnehcuoz/article/details/52793654)图片来自http://blog.sina.com.cn/s/blog_7155fb1a0100wzkz.html