在scikit-image's documentation中,它表示用于检测垂直线的内核是:
1 0 -1
2 0 -2
1 0 -1
如果我这样做:
img = np.array([[1.0, 2.0, 3.0], [4, 5, 6], [7, 8, 9]])
Lx = filters.sobel_v(img)
然后打印Lx
,我得到:
Lx
0.0000 0.0000 0.0000
0.0000 2.0000 0.0000
0.0000 0.0000 0.0000
这没有任何意义,因为结果应该是:
1*(-1) + 3*1 + 4*(-2) + 6*2 + 7*(-1) + 9*1 = -16 + 24 = 8
而不是2
,位于中心位置。
发生了什么事?
答案 0 :(得分:1)
差异是由于缩放系数 1/4
。
用于垂直边缘检测的Sobel内核通常定义为:
这个内核可以作为平滑内核和衍生内核的产品进行分解,如下所示:
为了使平滑内核成为真正的平均滤波器,它应该按因子1/(1+2+1) = 1/4
进行缩放。通过这样做,Sobel内核变为:
虽然文档中没有提到缩放因子,但它实际上是在实现中使用的(请查看source code以说服自己)。