1

我试图找出在 skimage.filters 的 laplace 函数中使用的内核。我知道拉普拉斯滤波器基于矩阵卷积,但我似乎无法理解 skimage.filters 的拉普拉斯函数产生的值。

这是一个例子:

>>> import numpy as np
>>> import skimage
>>> from skimage.filters import laplace
>>> x = [[2,3,2],[5,3,6],[3,7,3]]
>>> x = np.array(x)
>>> x
array([[2, 3, 2],
       [5, 3, 6],
       [3, 7, 3]])
>>> laplace(x, ksize=3)
array([[ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00],
       [ 0.00000000e+00, -9.75781955e-19,  0.00000000e+00],
       [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00]])

如果 skimage.filters 的 laplace 函数使用内核/运算符

[[ 0,  1, 0],
 [ 1, -4, 1],
 [ 0,  1, 0]]

然后根据矩阵卷积,它应该已经产生了输出

[[ 0,  5, -1],
 [12, -9, 16],
 [ 0, 19, -1]]

代替

[[ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00],
 [ 0.00000000e+00, -9.75781955e-19,  0.00000000e+00],
 [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00]]

我对内核/运算符 skimage.filters 的 laplace 函数使用什么使几乎每个输出值都接近于零感到非常困惑,例如 -9.75781955e-19。老实说,我不认为任何合理的内核/运算符可以产生这个输出,所以也许我只是不理解 Python 的 skimage.filters 的 laplace 函数是如何工作的......

对此问题的任何帮助/评论/建议/见解将不胜感激。谢谢你。

4

1 回答 1

0

欢迎来到 Stack Overflow 的 scikit-image 线程!这种奇怪行为的原因是dtypeof xisint64和 scikit-imagelaplace函数调用img_as_float以便以浮点数进行计算,但是在转换 dtype 时,它​​还会将数组除以原始 dtype 的最大值(此处为 2 ^63 - 1),因此值非常小。如果您想避免这个问题,您可以在将图像传递给 laplace 之前将其转换为浮动:

>>> x = x.astype(np.float)                                                
>>> filters.laplace(x)                                                    
array([[-4.,  2., -5.],
       [ 7., -9., 10.],
       [-6., 12., -7.]])

(该函数使用默认的边界条件模式,scipy.ndimage.convolve即“反射”)。

请注意,这种行为(除以 dtype 的最大值)可能会随着 scikit-image 1.0 的变化而改变,正是因为我们注意到它可能会像您的情况一样让用户感到困惑。

于 2020-06-21T12:51:55.807 回答