Skimage filters.sobel_v 结果没有意义。为什么?

Skimage filters.sobel_v result not making sense. Why?

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,在中间位置。

这是怎么回事?

差异是由于比例因子 1/4

垂直边缘检测的Sobel核通常定义为:

这个内核可以分解为平滑内核和导数内核的乘积,如下所示:

为了使平滑内核成为真正的平均滤波器,它应该按比例缩放 1/(1+2+1) = 1/4。通过这样做,Sobel 内核变为:

虽然文档中没有提到比例因子,但实际上在实现中使用了它(查看source code说服自己)。