skimage.filters.laplace函数在Python中是如何工作的?
我试图找出在skimage.filters的拉普拉斯函数中使用的内核。我知道拉普拉斯滤波器是基于矩阵卷积的,但我似乎无法理解skimage.filters的拉普拉斯函数产生的值 这是一个例子:skimage.filters.laplace函数在Python中是如何工作的?,python,filter,convolution,scikit-image,laplacian,Python,Filter,Convolution,Scikit Image,Laplacian,我试图找出在skimage.filters的拉普拉斯函数中使用的内核。我知道拉普拉斯滤波器是基于矩阵卷积的,但我似乎无法理解skimage.filters的拉普拉斯函数产生的值 这是一个例子: >>> import numpy as np >>> import skimage >>> from skimage.filters import laplace >>> x = [[2,3,2],[5,3,6],[3,7,3]] &
>>> 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]])
If skimage.filters的拉普拉斯函数使用
[[ 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]]
我对什么是内核/运算符撇取非常困惑。过滤器的拉普拉斯函数使用的几乎所有输出值都接近于零,例如-9.75781955e-19。老实说,我不认为任何合理的内核/操作符都能产生这种输出,所以我可能只是不理解Python的skimage.filters的laplace函数是如何工作的
对此问题的任何帮助/评论/建议/见解将不胜感激。谢谢。欢迎使用堆栈溢出的scikit映像线程!出现这种奇怪行为的原因是
x
的dtype
是int64
,而scikit imagelaplace
函数调用img\u as\u float
以浮点数进行计算,但在强制转换dtype时,它还将数组除以原始dtype的最大值(此处为2^63-1),因此值非常小。如果要避免此问题,可以在将图像传递给laplace之前将其转换为float:
>>> x = x.astype(np.float)
>>> filters.laplace(x)
array([[-4., 2., -5.],
[ 7., -9., 10.],
[-6., 12., -7.]])
(该函数使用默认边界条件模式scipy.ndimage.convolve
,即“反射”)
请注意,此行为(除以数据类型的最大值)很可能会随着scikit image 1.0而改变,这正是因为我们注意到它可能会让用户像您的情况一样感到困惑。欢迎使用堆栈溢出的scikit image线程!这种奇怪行为的原因是
x
的dtype
是int64
,而scikit imagelaplace
函数调用img\u as\u float
以进行浮点数计算,但在强制转换数据类型时,它也会将数组除以原始数据类型的最大值(此处为2^63-1),因此值非常小。如果要避免此问题,可以在将图像传递给laplace之前将其转换为float:
>>> x = x.astype(np.float)
>>> filters.laplace(x)
array([[-4., 2., -5.],
[ 7., -9., 10.],
[-6., 12., -7.]])
(该函数使用默认边界条件模式scipy.ndimage.convolve
,即“反射”)
请注意,此行为(除以数据类型的最大值)很可能会随着scikit image 1.0而改变,这正是因为我们注意到它可能会让用户像您的情况一样感到困惑。啊,我明白了,谢谢!这解释了很多。作为后续,有没有办法使用
常量的边界条件模式来代替反射?我知道scipy.ndimage.laplace
允许我这样做,但我不确定如何使用skimage.filters.laplace
。另外,作为一个更广泛的问题,在scipy.ndimage.laplace
上使用skimage.filters.laplace
的优点和缺点是什么?很遗憾,您目前无法更改边界模式,但我们会接受添加边界模式的请求s功能!我们这里有一个贡献者指南:或者,请使用功能请求在创建一个问题!=)我不认为skimage的laplace和ndimage之间会有太大的区别。啊,我明白了,谢谢!这解释了很多。作为跟进,是否有办法使用常量
的边界条件模式而不是反射
?我知道scipy.ndimage.laplace
允许我这样做,但我不确定如何使用skimage.filters.laplace
实现这一点。还有一个更广泛的问题,使用skimage.filters.laplace
而不是scipy.ndimage.laplace
的利弊是什么?很遗憾,您目前无法更改边界模式,但我们会接受添加此功能的请求!我们这里有一个贡献者指南:或者,请使用功能请求在创建一个问题!=)我不认为skimage的laplace和ndimage的有多大区别。