关于Sobel核的一般数学推导(3x3、5x5、7x7,1阶、2阶、3阶...)

标准的3\times 3 Sobel一阶核在x方向(本文仅考虑x方向,y方向为x方向的转置)的模板为


\begin{bmatrix}
-1 & 0 & 1\\
-2 & 0 & 2\\
-1 & 0 & 1
\end{bmatrix}

即为S_3,显然,这个核是两个向量的乘积,即


S_3=\begin{bmatrix}
-1 & 0 & 1\\
-2 & 0 & 2\\
-1 & 0 & 1
\end{bmatrix}=\begin{bmatrix}
1\\
2\\
1
\end{bmatrix}\cdot\begin{bmatrix}
-1 & 0 & 1
\end{bmatrix}

为方便讨论,我们将行向量称为差分核(OpenCV中Sobel函数参数dy\not = 0的核),列向量称为平滑核(OpenCV中Sobel函数参数dx=0的核),虽然根据最终结果来看,这两种核并没有本质区别。

平滑核

首先看平滑核。平滑核的系数满足对应级数的杨辉三角的系数,也就是二项式(a+b)^n的系数。杨辉三角形的系数如下:

n=0:1

n=1:\begin{matrix}1&1\end{matrix}

n=2:\begin{matrix}1&2&1\end{matrix}

n=3:\begin{matrix}1&3&3&1\end{matrix}

n=4:\begin{matrix}1&4&6&4&1\end{matrix}

n=5:\begin{matrix}1&5&10&10&5&1\end{matrix}

n=6:\begin{matrix}1&6&15&20&15&6&1\end{matrix}

\cdots

我们将级数为n的杨辉三角系数组成的矩阵即为P_n,则3\times 3的平滑核的系数为P_n。即对于m\times m的平滑核,其系数为P_{m-1}。那么5\times 5的平滑核模板为


5\times 5:P_4=\begin{bmatrix}
1 & 4 & 6 & 4 & 1\\
\end{bmatrix}

7\times 7的平滑核模板为


7\times 7:P_6=\begin{bmatrix}
1 & 6 & 15 & 20 & 15 & 6 & 1\\
\end{bmatrix}

一阶差分核

对于3\times 3的Sobel核,一阶差分核的系数(记为D'_3)为一阶差分方程系数矩阵的翻转(设为G_1)与P_1的对P_1补0卷积。

在离散情况下,一阶差分公式如下:


\frac{\partial f}{\partial x}=f(x+1)-f(x)

其系数矩阵G'


G'=\begin{bmatrix}
-1 & 1
\end{bmatrix}

为了保证卷积后的结果与3\times 3的Sobel核一致,还需要对P_1的前后各补充一个0,即


P_{1补0}=\begin{bmatrix}
0 & 1 & 1 & 0
\end{bmatrix}

D_3'的第x个参数为d_3'(x)G_1的第x个参数为g'(x)P_{1补0}的第x个参数为p_1(x),则有


d_3'(x)=(g'*p_1)(x)=\sum_{i=1}^2g'(i)p_1(x+2-i)

3\times 3的一阶差分核的计算方式为


\begin{align*}
D'_3&=G'*P_{1补0}\\
&=\begin{bmatrix}
\sum_{i=1}^{2}g'(i)p_1(3-i)&\sum_{i=1}^{2}g'(i)p_1(4-i)&\sum_{i=1}^{2}g'(i)p_1(5-i)
\end{bmatrix}\\
&=\begin{bmatrix}
\begin{bmatrix}
1 & -1
\end{bmatrix}\cdot\begin{bmatrix}
0\\
1
\end{bmatrix} & \begin{bmatrix}
1 & -1
\end{bmatrix}\cdot\begin{bmatrix}
1\\
1
\end{bmatrix} & \begin{bmatrix}
1 & -1
\end{bmatrix}\cdot\begin{bmatrix}
1\\
0
\end{bmatrix}
\end{bmatrix}\\
&=\begin{bmatrix}
-1 & 0 & 1
\end{bmatrix}
\end{align*}

同理,5\times 5的一阶差分核的计算方式为


\begin{align*}
D'_5&=G'*P_{4补0}\\
&=\begin{bmatrix}
\sum_{i=1}^{2}g'(i)p_4(3-i)&\sum_{i=1}^{2}g'(i)p_4(4-i)&\sum_{i=1}^{2}g'(i)p_4(5-i)&\sum_{i=1}^{2}g'(i)p_4(6-i)&\sum_{i=1}^{2}g'(i)p_4(7-i)
\end{bmatrix}\\
&=\begin{bmatrix}
\begin{bmatrix}
1 & -1
\end{bmatrix}\cdot\begin{bmatrix}
0\\
1
\end{bmatrix} & \begin{bmatrix}
1 & -1
\end{bmatrix}\cdot\begin{bmatrix}
1\\
3
\end{bmatrix} & \begin{bmatrix}
1 & -1
\end{bmatrix}\cdot\begin{bmatrix}
3\\
3
\end{bmatrix} & \begin{bmatrix}
1 & -1
\end{bmatrix}\cdot\begin{bmatrix}
3\\
1
\end{bmatrix} & \begin{bmatrix}
1 & -1
\end{bmatrix}\cdot\begin{bmatrix}
1\\
0
\end{bmatrix}
\end{bmatrix}\\
&=\begin{bmatrix}
-1 & -2 & 0 & 2 & 1
\end{bmatrix}
\end{align*}

7\times 7的一阶差分核计算方式同理,为(读者可自行继续计算推导)


D'_7=G'*P_{6补0}

二阶差分核

对于3\times 3的Sobel核,2阶差分核的系数(D'')为2阶差分方程系数矩阵的翻转(G'')与P_0的补0卷积。在离散情况下,二阶差分公式如下:


\begin{align*}
\frac{\partial^2 f}{\partial x^2}&=\partial_x f(x+1)-\partial_x f(x)\\
&=[f(x+2)-f(x+1)]-[f(x+1)-f(x)]\\
&=f(x+2)-2f(x+1)+f(x)
\end{align*}

其系数矩阵G''


G''=\begin{bmatrix}
1 & -2 & 1
\end{bmatrix}

为了保证卷积后的结果与3\times 3的Sobel核一致,此时的P_0需要左右各补充2个0,即


P_{0补0}=\begin{bmatrix}
0 & 0 & 1 & 0 & 0
\end{bmatrix}

3\times 3的二阶差分核的计算方式为


D''_3=G''*P_{0补0}

同理,5\times 57\times 7的二阶差分核计算方式为


\begin{aligned}
D''_5&=G''*P_{2补0}\\
D''_7&=G''*P_{4补0}
\end{aligned}

高阶差分核

对于m\times m的Sobel核,n阶(n<m)差分核的系数(记为D^{(n)})为n阶差分方程系数矩阵的翻转(设为G_{(n)})与P_{m-n-1}的补0卷积(左右各补充n个0),即


D^{(n)}_m=G^{(n)}*P_{m-n-1补0}

其中G^{(n)}满足二项式(a-b)^n,系数为二项式系数的翻转,仅需将杨辉三角每行的偶数列取相反数即可。

一般公式

统一平滑核与差分核

继续考察一般差分公式,我们设置G_{(0)}对应二项式(a-b)^0的系数,即为1。可以发现,当n=0时,


D^{(0)}=G^{(0)}*P_{m-1}=P_{m-1}

与平滑核公式一致。此时不需要补0。

单方向Sobel核一般公式(以x方向为例)

从上述公式得知,x方向的m\times mn(n<m)阶Sobel核计算公式为


\begin{align*}
S(m)&=(D^{(0)})^T\cdot D^{(n)}(m)\\
&=P_{m-1}^T\cdot(G^{(n)}*P_{m-n-1补0})
\end{align*}

Sobel核一般公式

因此,对于m\times m的Sobel核,x方向为dx阶,y方向为dy阶(dx+dy<m),则计算公式为


\begin{aligned}
S(m)&=(D^{(dy)})\cdot D^{(dx)}\\
&=(G^{(dy)}*P_{(m-dy-1)补0})^T\cdot(G^{(dx)}*P_{(m-dx-1)补0})
\end{aligned}

读者可以使用OpenCV的getDerivKernels函数进行验证。 思考:为什么OpenCV仅提供1、3、5、7核的Sobel算子?

全部评论

相关推荐

评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务