Python 如何在频域中创建这样平滑的高通滤波器

Python 如何在频域中创建这样平滑的高通滤波器,python,filter,fft,Python,Filter,Fft,我使用np.fft.fft2获得频域,并希望在频域上应用高通滤波器,但遮罩只是一个数字为0的圆,其他数字为1,因此在转换回时,它对结果图像有振铃效应 那么,我怎样才能创建这样一个平滑版本的过滤器呢 一些函数可用于生成二维高斯分布: def gaussian_2d(x, y, mu1, mu2, sig): return np.exp(- (np.power(x - mu1, 2) + np.power(x - mu2, 2)) / (2 * np.power(sig, 2))) de

我使用np.fft.fft2获得频域,并希望在频域上应用高通滤波器,但遮罩只是一个数字为0的圆,其他数字为1,因此在转换回时,它对结果图像有振铃效应

那么,我怎样才能创建这样一个平滑版本的过滤器呢


一些函数可用于生成二维高斯分布:

def gaussian_2d(x, y, mu1, mu2, sig):
    return np.exp(- (np.power(x - mu1, 2) + np.power(x - mu2, 2)) / (2 * np.power(sig, 2)))

def gen_gaussian_2d_filter(size, radius):
    grid = [[0] * size for _ in range(size)]
    for i in range(size):
        for j in range(size):
            grid[i][j] = gaussian_2d(i, j, size/2, size/2, radius)
    return np.array(grid)

您想要在该图像中使用的过滤器似乎具有
半径
~
大小/10
,但您当然可以可视化过滤器并对其进行调整。此外,剪裁功能可能会有所帮助,因为您可能希望保留所有低频信息,请参阅。

这只会产生一个“1”值(假设传递的是圆)。最好只使用移动平均滤波器(即矩形窗口)并在两个维度上使用上述二进制滤波器进行卷积。为什么这只会导致单个“1”?另外,矩形窗口可以很好地逼近滤波器,但它不是径向对称的,因此它不仅在频率上而且在相位上都不是滤波器。因为高斯函数只有在
x=[mu1,mu2]
时才会达到1的值,而OP显示的滤波器的通带要大得多。我刚刚读到,值在过滤器内部为0,外部为1(即过滤器反转),但该点仍然存在+1对于相位滤波器备注,我不确定OP在这方面的要求,他必须详细说明一下。这就是为什么我说
numpy.clip
会有帮助,因为它可以钳制值。我相信重新缩放应该是微不足道的。