使用卷积函数#

概述#

提供两个卷积函数。它们被导入为:

>>> from astropy.convolution import convolve, convolve_fft

它们都用作:

>>> result = convolve(image, kernel)  
>>> result = convolve_fft(image, kernel)  

convolve() 实现为直接卷积算法,而 convolve_fft() 使用快速傅立叶变换(FFT)。因此,前者更适合于小内核,而后者对于较大的内核更有效。

输入的图像和内核应该是列表或 numpy 具有1、2或3维的数组(对于映像和内核,维的数量应该相同)。结果是 numpy 数组的维数与输入图像相同。总是用浮点进行卷积。

这个 convolve() 函数接受可选的 boundary= 描述如何在数组边缘执行卷积的参数。的值 boundary 可以是:

  • None :将结果值设置为零,其中内核扩展到数组的边缘之外(默认)。

  • 'fill' :将数组边界外的值设置为常量。如果指定了此选项,则应使用 fill_value= 参数,默认为零。

  • 'wrap' :假设边界是周期性的。

  • 'extend' :将数组外的值设置为最接近的数组值。

默认情况下,内核不是标准化的。要在卷积之前对其进行规范化,请使用:

>>> result = convolve(image, kernel, normalize_kernel=True)  

实例#

使用自定义内核平滑一维数组,无需边界处理:

>>> import numpy as np
>>> convolve([1, 4, 5, 6, 5, 7, 8], [0.2, 0.6, 0.2])  
array([1.4, 3.6, 5. , 5.6, 5.6, 6.8, 6.2])

如上所述,但对边界使用“扩展”算法:

>>> convolve([1, 4, 5, 6, 5, 7, 8], [0.2, 0.6, 0.2], boundary='extend')  
array([1.6, 3.6, 5. , 5.6, 5.6, 6.8, 7.8])

如果原始数组中存在NaN值,则将使用内核对其进行插值:

>>> import numpy as np
>>> convolve([1, 4, 5, 6, np.nan, 7, 8], [0.2, 0.6, 0.2], boundary='extend')  
array([1.6 , 3.6 , 5.  , 5.75, 6.5 , 7.25, 7.8 ])

内核和数组可以指定为列表或 numpy 数组。以下示例演示如何将1D数组构造为列表:

>>> kernel = [0, 1, 0]
>>> result = convolve(spectrum, kernel)  

作为列表的二维数组:

>>> kernel = [[0, 1, 0],
...           [1, 2, 1],
...           [0, 1, 0]]
>>> result = convolve(image, kernel)  

一个3D数组作为一个列表:

>>> kernel = [[[0, 0, 0], [0, 2, 0], [0, 0, 0]],
...           [[0, 1, 0], [2, 3, 2], [0, 1, 0]],
...           [[0, 0, 0], [0, 2, 0], [0, 0, 0]]]
>>> result = convolve(cube, kernel)  

籽粒#

上面的示例使用自定义内核,但是 astropy.convolution 还包括许多内置内核,如中所述 卷积核 .