我有一个带有成像工件的数据图像,它是一个正弦背景,我想删除它。由于它是一个单频正弦波,傅里叶变换和带通滤波器或“陷波滤波器”#34; (我认为我在+ -omega处使用高斯滤波器)。
在尝试这样做时,我注意到两件事:
1)只需执行fft和back,我就减少了正弦波分量,如下所示。似乎只是通过去那里然后回来对数据进行一些高通滤波?
import numpy as np
f = np.fft.fft2(img) #do the fourier transform
fshift1 = np.fft.fftshift(f) #shift the zero to the center
f_ishift = np.fft.ifftshift(fshift1) #inverse shift
img_back = np.fft.ifft2(f_ishift) #inverse fourier transform
img_back = np.abs(img_back)
这是img_back的图片:
也许这里的过滤对我来说已经足够了,但我对它没有那么自信,因为我对背景抑制没有很好的理解。
2)为了更加确定在不需要的频率上的抑制,我做了一个布尔带通#'掩码并将其应用于数据,但傅立叶变换忽略掩码。
a = shape(fshift1)[0]
b = shape(fshift1)[1]
ro = 8
ri = 5
y,x = np.ogrid[-a/2:a/2, -b/2:b/2]
m1 = x*x + y*y >= ro*ro
m2 = x*x + y*y <= ri*ri
m3=np.dstack((m1,m2))
maskcomb =[]
for r in m3:
maskcomb.append([any(c) for c in r]) #probably not pythonic, sorry
newma = np.invert(maskcomb)
filtdat = ma.array(fshift1,mask=newma)
imshow(abs(filtdat))
f_ishift = np.fft.ifftshift(filtdat)
img_back2 = np.fft.ifft2(f_ishift)
img_back2 = np.abs(img_back2)
此处的结果与之前相同,因为np.fft会忽略蒙版。解决这个问题很简单:
filtdat2 = filtdat.filled(filtdat.mean())
不幸的是,(但反思也不出所料)结果如下所示:
左图是FFT的幅度,应用了带通滤波器。它是中央(DC)组件周围的暗环。相位未显示。
显然,&#39; brickwall&#39;过滤器不是正确的解决方案。这个过滤器制作戒指的现象在这里得到了很好的解释:What happens when you apply a brick-wall filter to a 1D dataset.所以现在我被卡住了。也许最好使用其中一种内置的scipy方法,但它们似乎适用于1d数据,如in this implementation of a butterworth filter。可能正确的事情涉及使用fftconvolve()完成here to blur an image.我关于fftconvolve的问题是:它是否需要两个&#39;图像&#39; (图像和滤镜)在真实空间?我想是的,但在这个例子中他们使用高斯,所以它是模糊的(fft(高斯)=高斯)。如果是这样,那么尝试制作真正的空间带通滤波器似乎是错误的。也许正确的策略使用convolve2d()与傅立叶空间图像和自制过滤器。如果是这样,你知道如何制作一个好的2d滤镜吗?