本来不想写这个博客的,但是看见很多篇介绍sobel算子的博客都没有把本质解释出来,所以我想尝试写一些把。
soble算子我们都知道的是:
它对X方向求导的卷积核为:
-1 | 0 | 1 |
-2 | 0 | 2 |
-1 | 0 | 1 |
可是为什么是这样的呢?
原因如下:
我们知道,图像求到是用差分近似的。
如:f(x,y) - f(x-1,y)
f(x+1,y)-f(x,y)
f(x+1,y) - f(x-1,y)
sobel 算子采用的第三种 f(x+1,y) - f(x-1,y)。
也就是:
-1 | 0 | 1 |
那它现在还是和一开始那个算子不一样啊,接着看:
我们一开始并不知道图像到底是不是平滑的,有没有噪声。如果不是平滑的,那么我们在求导时,得到的结果将非常差。所以我们要提前给这个图像进行滤波后再进行求导。
即:
其实本质上求导也是求卷积,这样操作不就要执行两边卷积吗,而且卷积是很浪费时间的操作。我们利用卷积的性质可以将上式变为:
这样我们就可以只对卷积核g求导让其成为另一种卷积核,之后只用这个卷积核与f进行卷积就可以了。
实际上:
求导为:
-1 | 0 | 1 |
g为(对x方向进行高斯滤波):
1 |
2 |
1 |
这两个乘起来不就是才开始那个算子吗?
我现在解释下为什么g是这个样子的。
我们看一个经典的高斯核:
1 | 2 | 1 |
2 | 4 | 2 |
1 | 2 | 1 |
它可以写为:
*
其中 就是对x方向的高斯滤波,另一个是对y的。
不信可以试验一下:
cov = 65
cov =
cov=65
所以宗上:
sobel算子对x方向求导:
* =
对y方向也一样算。