使用卷积函数#
概述#
提供两个卷积函数。它们被导入为:
>>> 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
还包括许多内置内核,如中所述 卷积核 .