gpt4 book ai didi

python - Python中使用fft2的"valid"和"full"卷积

转载 作者:行者123 更新时间:2023-11-28 16:38:46 25 4
gpt4 key购买 nike

这是一个不完整的 FFT 卷积 Python 片段。

我想修改一下让它支持,1)有效卷积2)和全卷积

import numpy as np
from numpy.fft import fft2, ifft2

image = np.array([[3,2,5,6,7,8],
[5,4,2,10,8,1]])

kernel = np.array([[4,5],
[1,2]])

fft_size = # what size should I put here for,
# 1) valid convolution
# 2) full convolution

convolution = ifft2(fft2(image, fft_size) * fft2(kernel, fft_size))

提前谢谢你。

最佳答案

对于长度为LM 的一维数组xy,resp。 ,对于 mode="full",您需要将 FFT 填充到 L + M - 1 的大小。对于二维情况,将该规则应用于每个轴。

使用 numpy,您可以计算二维情况下的大小

np.array(x.shape) + np.array(y.shape) - 1

要实现“有效”模式,您必须计算“完整”结果,然后切出有效部分。对于 1-d,假设 L > M,有效数据是完整数据中心的 L - M + 1 元素。同样,对二维情况下的每个轴应用相同的规则。

例如,

import numpy as np
from numpy.fft import fft2, ifft2


def fftconvolve2d(x, y, mode="full"):
"""
x and y must be real 2-d numpy arrays.

mode must be "full" or "valid".
"""
x_shape = np.array(x.shape)
y_shape = np.array(y.shape)
z_shape = x_shape + y_shape - 1
z = ifft2(fft2(x, z_shape) * fft2(y, z_shape)).real

if mode == "valid":
# To compute a valid shape, either np.all(x_shape >= y_shape) or
# np.all(y_shape >= x_shape).
valid_shape = x_shape - y_shape + 1
if np.any(valid_shape < 1):
valid_shape = y_shape - x_shape + 1
if np.any(valid_shape < 1):
raise ValueError("empty result for valid shape")
start = (z_shape - valid_shape) // 2
end = start + valid_shape
z = z[start[0]:end[0], start[1]:end[1]]

return z

这是应用于您的示例数据的函数:

In [146]: image
Out[146]:
array([[ 3, 2, 5, 6, 7, 8],
[ 5, 4, 2, 10, 8, 1]])

In [147]: kernel
Out[147]:
array([[4, 5],
[1, 2]])

In [148]: fftconvolve2d(image, kernel, mode="full")
Out[148]:
array([[ 12., 23., 30., 49., 58., 67., 40.],
[ 23., 49., 37., 66., 101., 66., 21.],
[ 5., 14., 10., 14., 28., 17., 2.]])

In [149]: fftconvolve2d(image, kernel, mode="valid")
Out[149]: array([[ 49., 37., 66., 101., 66.]])

可以添加更多错误检查,并且可以对其进行修改以处理复杂数组和 n 维数组。如果选择额外的填充以使 FFT 计算更高效,那就太好了。如果您进行了所有这些改进,您最终可能会得到类似于 scipy.signal.fftconvolve 的结果。 ( https://github.com/scipy/scipy/blob/master/scipy/signal/signaltools.py#L210 ):

In [152]: from scipy.signal import fftconvolve

In [153]: fftconvolve(image, kernel, mode="full")
Out[153]:
array([[ 12., 23., 30., 49., 58., 67., 40.],
[ 23., 49., 37., 66., 101., 66., 21.],
[ 5., 14., 10., 14., 28., 17., 2.]])

In [154]: fftconvolve(image, kernel, mode="valid")
Out[154]: array([[ 49., 37., 66., 101., 66.]])

关于python - Python中使用fft2的"valid"和"full"卷积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22325211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com