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说服自己)。
在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说服自己)。