我在 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 函数可能发生了变化,或者我正在导入的图像以某种方式不一样(似乎不太可能,代码会产生与其他图像类似的行为)。

