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变换的原理介绍,这样简单的车道线检测原理应该差不多清楚了。