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

时间:2017-04-24 12:27:03

标签: image-processing edge-detection scikit-image sobel

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 个答案:

答案 0 :(得分:1)

差异是由于缩放系数 1/4

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

Gv

这个内核可以作为平滑内核和衍生内核的产品进行分解,如下所示:

outer product

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

Gv scaled

虽然文档中没有提到缩放因子,但它实际上是在实现中使用的(请查看source code以说服自己)。