Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
skimage.filters.laplace函数在Python中是如何工作的?_Python_Filter_Convolution_Scikit Image_Laplacian - Fatal编程技术网

skimage.filters.laplace函数在Python中是如何工作的?

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]] &

我试图找出在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]]
>>> 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 image
laplace
函数调用
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 image
laplace
函数调用
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的有多大区别。