您如何正确实施 Scipy 的 FFT 程序以产生低通滤波器 - 图像处理

计算科学 Python scipy 傅里叶变换 图像处理
2021-11-29 13:57:04

我在 Jason M. Kinser 的文本“图像运算符:Python 第一版中的图像处理”中遵循这个低通滤波器示例,但似乎无法复制它们的结果。

正文的代码:

import imageio
import scipy.fftpack as ft
import mgcreate as mgc

amg = imageio.imread('data/reschartsmall.png', as_gray=True)
bmg = 1 - amg/amg.max()
cmg = ft.fftshift(ft.fft2(bmg))
V,H = cmg.shape
circ = mgc.Circle((V,H), (V/2,H/2), 10)
dmg = ft.ifft2(ft.fftshift(circ*cmg))
imageio.imsave('figure.png', -dmg.real)

其中 Circle 函数由下式给出

# mgcreate.py
def Circle(size, loc, rad):
    b1,b2 = np.indices(size)
    b1,b2 = b1-loc[0], b2-loc[1]
    mask = b1*b1 + b2*b2
    mask = (mask <= rad*rad).astype(int)
    return mask

下面是原图和上面的低通滤波代码应用后的最终图:

在此处输入图像描述

我从https://raw.githubusercontent.com/joefoxva1/CDS468/master/Lectures10_11_12/USAF1951w.jpg加载图像, 但除此之外,我使用的是相同的代码。这是我正在制作的图像:

在此处输入图像描述

我的图像似乎是倒置的(显然是通过将图像保存为 dmg.real 而不是 -dmg.real 来解决的)并且不均匀(两个 FFT 程序一起在图像的中心创建了一个带)。我不明白为什么我观察到相同代码的不同行为。我的猜测是,自文本发布以来,Scipy fftpack 函数可能发生了变化,或者我正在导入的图像以某种方式不一样(似乎不太可能,代码会产生与其他图像类似的行为)。

0个回答
没有发现任何回复~