我有一个带有成像伪影的数据图像,它以正弦背景的形式出现,我想去掉它。因为它是一个单一频率的正弦波,傅立叶变换和带通滤波器或“陷波滤波器”(我想我会在这里使用一个正Ω高斯滤波器)似乎很自然。
python - python:图像的带通滤波器-LMLPHP
为了做到这一点,我注意到两件事:
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_背面的图像:
python - python:图像的带通滤波器-LMLPHP
也许这里的过滤对我来说已经足够好了,但是我没有那么自信,因为我对背景抑制没有很好的理解。
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())
不幸的是,(但经过深思熟虑也不足为奇)结果如下:
python - python:图像的带通滤波器-LMLPHP
左图是应用带通滤波器的FFT振幅。它是围绕中心(DC)组件的暗环。未显示阶段。
显然,“砖墙”过滤器不是正确的解决方案。这里很好地解释了用这个过滤器制作圆环的现象:What happens when you apply a brick-wall filter to a 1D dataset.
所以现在我被卡住了。也许最好使用一种内置的scipy方法,但它们似乎是用于1d数据,如in this implementation of a butterworth filter。可能正确的做法是使用fftconvolve()as donehere to blur an image.我关于fftconvolve的问题是:它是否需要“图像”(图像和过滤器)都在真实空间中?我认为是的,但是在这个例子中他们使用了高斯,所以它是不明确的(fft(高斯)=Gaussian)。如果是这样,那么尝试制作一个真正的空间带通滤波器似乎是错误的。也许正确的策略是使用卷积2d()和傅立叶空间图像和自制的滤波器。如果是这样,你知道如何制作一个好的二维滤波器吗?

最佳答案

所以,这里的一个问题是,你的背景正弦曲线有一个周期,和你想要保存的信号成分没有太大的不同。即,信号峰值的间隔与背景周期大致相同。这将使过滤变得困难。
我的第一个问题是,从一个实验到另一个实验,这个背景是真的不变的,还是取决于样本和实验设置?如果它是常量,那么背景帧相减比过滤效果更好。
正如您所说,大多数标准的scipy.信号滤波器功能(bessel、chebychev等)都是为一维数据设计的。但是可以很容易地将它们扩展到二维各向同性滤波中。频率空间中的每个滤波器都是f的有理函数。这两种表示是分子和分母多项式的系数[a,b],或者是多项式的系数表示[z,p,k]。,:H(f) = k(f-z0)*(f-z1)/(f-p0)*(f-p1)您可以从一个滤波器设计算法中提取多项式,将其作为sqrt(x^2+y^2)的函数进行计算,并将其应用于频域数据。
你能发布一个链接到原始图像数据吗?

关于python - python:图像的带通滤波器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31952560/

10-14 18:06