车道线检测之-sobel算子边缘检测原理介绍

sobel算子是canny边缘检测的核心,也是车道线检测的中心,所以弄清其原理很重要。
要理解sobel边缘检测,首先弄清楚一点图像每一点的像素值是一个和x,y都相关的值,即f(x,y), 任意给定的x和y都可以索引到一个像素值。

下图一代表了一个普通的图像,从中画一条红线,相当于固定y,取上面的像素值可以得到下图二所示的图像,横轴为x的坐标,纵轴为像素值,图三则为像素值对x的导数(图二图三即为y固定为y0,f(x,y0)和x, f(x,y0)导数和x的图像),可以看出导数(梯度)最大或最小的地方即为该红线上边缘点所在的位置。有了这个概念之后,就可以进行下一步了
在这里插入图片描述

再来看下面这张图,任意一点的导数为在这里插入图片描述
下图一表示任意一点f对y的导数为0,因为图像在x轴方向上渐进,y方向上像素值相同。图二同理。图三f在左下角为黑色,右上角为白色,图像在x轴和y轴方向像素值都在增加,图示Θ角为梯度的方向,为像素强度增加最快的方向,向量的幅值为该方向上单位步长像素变化的量。具体公式见下图。

在这里插入图片描述
梯度计算公式:
在这里插入图片描述

所以接下来就是怎么用filter或者卷积核表示导数,从而对整张图计算梯度,见下图,从导数定义开始
在这里插入图片描述
但是,图像上的每一点(x,y)都是离散的点,所以离散导数的梯度计算公式为
在这里插入图片描述
所以任意一点的右导数可以用下面的卷积核表示在这里插入图片描述
那如果想要导数值更精确,导数更平滑呢,可以取左右导数的平均值
在这里插入图片描述
卷积核就变成下图所示,任意一点的导梯度为前后元素差的1/2在这里插入图片描述
那么如果想让梯度变得更平滑呢?这就是sobel operator
在这里插入图片描述
Sy同理,可以试着自己推导一下,但要注意卷积核一定是奇数,因为我们要求一个给定元素的梯度,中间元素两边的像素个数应该相同,这里的1/8是为了归一化。

好了,索贝尔算子就到这里了,这是canny边缘检测的核心,后续可能会有hough变换的原理介绍,这样简单的车道线检测原理应该差不多清楚了。