标准的3×3 Sobel一阶核在x方向(本文仅考虑x方向,y方向为x方向的转置)的模板为
−1−2−1000121
即为S3,显然,这个核是两个向量的乘积,即
S3=−1−2−1000121=121⋅[−101]
为方便讨论,我们将行向量称为差分核(OpenCV中Sobel函数参数dy=0的核),列向量称为平滑核(OpenCV中Sobel函数参数dx=0的核),虽然根据最终结果来看,这两种核并没有本质区别。
平滑核
首先看平滑核。平滑核的系数满足对应级数的杨辉三角的系数,也就是二项式(a+b)n的系数。杨辉三角形的系数如下:
n=0:1
n=1:11
n=2:121
n=3:1331
n=4:14641
n=5:15101051
n=6:1615201561
⋯
我们将级数为n的杨辉三角系数组成的矩阵即为Pn,则3×3的平滑核的系数为Pn。即对于m×m的平滑核,其系数为Pm−1。那么5×5的平滑核模板为
5×5:P4=[14641]
7×7的平滑核模板为
7×7:P6=[1615201561]
一阶差分核
对于3×3的Sobel核,一阶差分核的系数(记为D3′)为一阶差分方程系数矩阵的翻转(设为G1)与P1的对P1补0卷积。
在离散情况下,一阶差分公式如下:
∂x∂f=f(x+1)−f(x)
其系数矩阵G′为
G′=[−11]
为了保证卷积后的结果与3×3的Sobel核一致,还需要对P1的前后各补充一个0,即
P1补0=[0110]
令D3′的第x个参数为d3′(x),G1的第x个参数为g′(x),P1补0的第x个参数为p1(x),则有
d3′(x)=(g′∗p1)(x)=i=1∑2g′(i)p1(x+2−i)
则3×3的一阶差分核的计算方式为
D3′=G′∗P1补0=[∑i=12g′(i)p1(3−i)∑i=12g′(i)p1(4−i)∑i=12g′(i)p1(5−i)]=[[1−1]⋅[01][1−1]⋅[11][1−1]⋅[10]]=[−101]
同理,5×5的一阶差分核的计算方式为
D5′=G′∗P4补0=[∑i=12g′(i)p4(3−i)∑i=12g′(i)p4(4−i)∑i=12g′(i)p4(5−i)∑i=12g′(i)p4(6−i)∑i=12g′(i)p4(7−i)]=[[1−1]⋅[01][1−1]⋅[13][1−1]⋅[33][1−1]⋅[31][1−1]⋅[10]]=[−1−2021]
7×7的一阶差分核计算方式同理,为(读者可自行继续计算推导)
D7′=G′∗P6补0
二阶差分核
对于3×3的Sobel核,2阶差分核的系数(D′′)为2阶差分方程系数矩阵的翻转(G′′)与P0的补0卷积。
在离散情况下,二阶差分公式如下:
∂x2∂2f=∂xf(x+1)−∂xf(x)=[f(x+2)−f(x+1)]−[f(x+1)−f(x)]=f(x+2)−2f(x+1)+f(x)
其系数矩阵G′′为
G′′=[1−21]
为了保证卷积后的结果与3×3的Sobel核一致,此时的P0需要左右各补充2个0,即
P0补0=[00100]
则3×3的二阶差分核的计算方式为
D3′′=G′′∗P0补0
同理,5×5和7×7的二阶差分核计算方式为
D5′′D7′′=G′′∗P2补0=G′′∗P4补0
高阶差分核
对于m×m的Sobel核,n阶(n<m)差分核的系数(记为D(n))为n阶差分方程系数矩阵的翻转(设为G(n))与Pm−n−1的补0卷积(左右各补充n个0),即
Dm(n)=G(n)∗Pm−n−1补0
其中G(n)满足二项式(a−b)n,系数为二项式系数的翻转,仅需将杨辉三角每行的偶数列取相反数即可。
一般公式
统一平滑核与差分核
继续考察一般差分公式,我们设置G(0)对应二项式(a−b)0的系数,即为1。可以发现,当n=0时,
D(0)=G(0)∗Pm−1=Pm−1
与平滑核公式一致。此时不需要补0。
单方向Sobel核一般公式(以x方向为例)
从上述公式得知,x方向的m×m的n(n<m)阶Sobel核计算公式为
S(m)=(D(0))T⋅D(n)(m)=Pm−1T⋅(G(n)∗Pm−n−1补0)
Sobel核一般公式
因此,对于m×m的Sobel核,x方向为dx阶,y方向为dy阶(dx+dy<m),则计算公式为
S(m)=(D(dy))⋅D(dx)=(G(dy)∗P(m−dy−1)补0)T⋅(G(dx)∗P(m−dx−1)补0)
读者可以使用OpenCV的getDerivKernels函数进行验证。
思考:为什么OpenCV仅提供1、3、5、7核的Sobel算子?