scipy.ndimage.filter.laplace()中使用的拉普拉斯掩码/内核是什么?

时间:2015-09-24 18:27:05

标签: python numpy image-processing filter scipy

一个简单的水平/垂直拉普拉斯掩模在内核的中心有4个(图的左侧)。类似地,对角线特征敏感的拉普拉斯掩模在内核的中心有8个(图中的右侧)。 scipy使用了哪个掩码,我可以选择使用哪个掩码吗?

enter image description here

1 个答案:

答案 0 :(得分:10)

一个简单的检查是声明一个零的二维数组,除了中心的一个系数设置为1,然后将laplace函数应用于它。具有过滤功能的属性是,如果您提交带有单个1的图像,则输出将是实际过滤器本身位于1所在位置的中心 - 查找impulse response ...或更具体地说,{ {3}}

如果您这样做,那么在您运行laplace方法后,您会看到它的样子:

In [13]: import numpy as np

In [14]: import scipy.ndimage.filters

In [15]: A = np.zeros((5,5))

In [16]: A[2,2] = 1

In [17]: B = scipy.ndimage.filters.laplace(A)

In [18]: A
Out[18]:
array([[ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.]])

In [19]: B
Out[19]:
array([[ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.],
       [ 0.,  1., -4.,  1.,  0.],
       [ 0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.]])

因此,它是第一个正在使用的内核,但请注意符号的变化。中心系数为正,而其他系数为负。

但是,如果你真的想知道底层发生了什么,请查看函数的文档:Point Spread Function - 这里有一个指向函数定义源的链接:

http://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.filters.laplace.html

您需要查看的相关代码如下:

def derivative2(input, axis, output, mode, cval):
    return correlate1d(input, [1, -2, 1], axis, output, mode, cval, 0)
return generic_laplace(input, derivative2, output, mode, cval)

基本上,[1, -2, 1]的一维内核正在独立地应用于每个维度,就像correlate1d函数所做的那样...所以首先是行,然后是列。这实际上会计算您在问题中看到的第一个遮罩。