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

9 阅读2分钟

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

[101202101]\begin{bmatrix} -1 & 0 & 1\\ -2 & 0 & 2\\ -1 & 0 & 1 \end{bmatrix}

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

S3=[101202101]=[121][101]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函数参数dy0dy\not = 0的核),列向量称为平滑核(OpenCV中Sobel函数参数dx=0dx=0的核),虽然根据最终结果来看,这两种核并没有本质区别。

平滑核

首先看平滑核。平滑核的系数满足对应级数的杨辉三角的系数,也就是二项式(a+b)n(a+b)^n的系数。杨辉三角形的系数如下: n=0:1n=0:1 n=1:11n=1:\begin{matrix}1&1\end{matrix} n=2:121n=2:\begin{matrix}1&2&1\end{matrix} n=3:1331n=3:\begin{matrix}1&3&3&1\end{matrix} n=4:14641n=4:\begin{matrix}1&4&6&4&1\end{matrix} n=5:15101051n=5:\begin{matrix}1&5&10&10&5&1\end{matrix} n=6:1615201561n=6:\begin{matrix}1&6&15&20&15&6&1\end{matrix} \cdots 我们将级数为n的杨辉三角系数组成的矩阵即为PnP_n,则3×33\times 3的平滑核的系数为PnP_n。即对于m×mm\times m的平滑核,其系数为Pm1P_{m-1}。那么5×55\times 5的平滑核模板为

5×5:P4=[14641]5\times 5:P_4=\begin{bmatrix} 1 & 4 & 6 & 4 & 1\\ \end{bmatrix}

7×77\times 7的平滑核模板为

7×7:P6=[1615201561]7\times 7:P_6=\begin{bmatrix} 1 & 6 & 15 & 20 & 15 & 6 & 1\\ \end{bmatrix}

一阶差分核

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

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

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

其系数矩阵GG'

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

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

P10=[0110]P_{1补0}=\begin{bmatrix} 0 & 1 & 1 & 0 \end{bmatrix}

D3D_3'的第xx个参数为d3(x)d_3'(x)G1G_1的第xx个参数为g(x)g'(x)P10P_{1补0}的第xx个参数为p1(x)p_1(x),则有

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

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

D3=GP10=[i=12g(i)p1(3i)i=12g(i)p1(4i)i=12g(i)p1(5i)]=[[11][01][11][11][11][10]]=[101]\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×55\times 5的一阶差分核的计算方式为

D5=GP40=[i=12g(i)p4(3i)i=12g(i)p4(4i)i=12g(i)p4(5i)i=12g(i)p4(6i)i=12g(i)p4(7i)]=[[11][01][11][13][11][33][11][31][11][10]]=[12021]\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×77\times 7的一阶差分核计算方式同理,为(读者可自行继续计算推导)

D7=GP60D'_7=G'*P_{6补0}

二阶差分核

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

2fx2=xf(x+1)xf(x)=[f(x+2)f(x+1)][f(x+1)f(x)]=f(x+2)2f(x+1)+f(x)\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*}

其系数矩阵GG''

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

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

P00=[00100]P_{0补0}=\begin{bmatrix} 0 & 0 & 1 & 0 & 0 \end{bmatrix}

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

D3=GP00D''_3=G''*P_{0补0}

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

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

高阶差分核

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

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

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

一般公式

统一平滑核与差分核

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

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

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

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

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

S(m)=(D(0))TD(n)(m)=Pm1T(G(n)Pmn10)\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×mm\times m的Sobel核,xx方向为dxdx阶,yy方向为dydy阶(dx+dy<mdx+dy<m),则计算公式为

S(m)=(D(dy))D(dx)=(G(dy)P(mdy1)0)T(G(dx)P(mdx1)0)\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算子?