python:图像的带通滤波器

Cla*_*mas 18 python numpy image-processing filter convolution

我有一个带有成像工件的数据图像,它是一个正弦背景,我想删除它.由于它是一个单频正弦波,傅立叶变换和带通滤波器或"陷波滤波器"(我认为我在+ -omega处使用高斯滤波器)似乎很自然.

我的数据. 红点是我想要的,kx + ky中的背景正弦波是不需要的.

在尝试这样做时,我注意到两件事:

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)
Run Code Online (Sandbox Code Playgroud)

这是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)
Run Code Online (Sandbox Code Playgroud)

这里的结果和以前一样,因为np.fft忽略了掩码.解决这个问题很简单:

filtdat2 = filtdat.filled(filtdat.mean())

不幸的是,(但反思也不出所料)结果显示在这里:

砖墙带通滤波器的结果.

左图是FFT的幅度,应用了带通滤波器.它是中央(DC)组件周围的暗环.相位未显示.

显然,'brickwall'过滤器不是正确的解决方案.从这个滤波器制作环的现象在这里得到了很好的解释:将砖墙滤波器应用于1D数据集时会发生什么.

所以现在我被卡住了.也许最好使用一种内置的scipy方法,但它们似乎适用于1d数据,就像在butterworth过滤器的实现中一样.可能正确的做法涉及使用fftconvolve(),就像在这里模糊图像一样. 我关于fftconvolve的问题是:它是否需要"图像"(图像和滤镜)在真实空间中?我想是的,但在例子中他们使用高斯,所以它是模糊的(fft(高斯)=高斯).如果是这样,那么尝试制作真正的空间带通滤波器似乎是错误的.也许正确的策略使用convolve2d()与傅立叶空间图像和自制过滤器.如果是这样,你知道如何制作一个好的2d滤镜吗?

Eva*_*van 3

因此,这里的一个问题是您的背景正弦波的周期与您试图保留的信号分量没有太大不同。即,信号峰值的间隔与背景的周期大致相同。这将使过滤变得困难。

我的第一个问题是这个背景在不同的实验中是否真正恒定,或者它是否取决于样本和实验设置?如果它是恒定的,那么背景帧减除会比过滤效果更好。

正如您所说,大多数标准 scipy.signal 滤波器函数(bessel、chebychev 等)都是为一维数据设计的。但您可以轻松地将它们扩展到二维各向同性过滤。频率空间中的每个滤波器都是 f 的有理函数。这两种表示形式是 [a,b],它们是分子和分母多项式的系数,或者 [z,p,k],它是多项式的因式分解表示,即:H(f) = k(f-z0)*(f-z1)/(f-p0)*(f-p1)您可以从其中一个过滤器中获取多项式设计算法,将其评估为 sqrt(x^2+y^2) 的函数,并将其应用于频域数据。

您可以发布原始图像数据的链接吗?