gpt4 book ai didi

python:图像的带通滤波器

转载 作者:IT老高 更新时间:2023-10-28 21:05:10 29 4
gpt4 key购买 nike

我有一个带有正弦背景的成像伪影的数据图像,我想将其移除。由于它是单频正弦波,傅里叶变换和带通滤波器或“陷波滤波器”(我想我会在 +-omega 处使用高斯滤波器)似乎很自然。

My data.  The red spots are what I want, the background sine wave in kx+ky is unwanted.

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

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 的图片:

The inverse fourier transform, no filter applied.

也许这里的过滤对我来说已经足够了,但我对它没有那么自信,因为我对背景抑制没有很好的了解。

2) 为了更确定抑制不需要的频率,我制作了一个 bool “带通”掩码并将其应用于数据,但傅立叶变换忽略了掩码。

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())

不幸的是,(但经过反射(reflection)也不足为奇)结果如下所示:

The result of a brickwall bandpass filter.

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

显然,“砖墙”过滤器不是正确的解决方案。用这个过滤器制作环的现象在这里得到了很好的解释:What happens when you apply a brick-wall filter to a 1D dataset.

所以现在我被困住了。也许使用一种内置的 scipy 方法会更好,但它们似乎适用于一维数据,如 in this implementation of a butterworth filter .可能正确的做法是使用 fftconvolve(),正如 here to blur an image. 所做的那样。我关于 fftconvolve 的问题是:它是否需要两个“图像”(图像和过滤器)都在真实空间中?我认为是的,但在示例中他们使用高斯,所以它是模棱两可的(fft(高斯)=高斯)。如果是这样,那么尝试制作真正的空间带通滤波器似乎是错误的。也许正确的策略使用 convolve2d() 与傅立叶空间图像和自制滤波器。如果是这样,你知道如何制作一个好的二维过滤器吗?

最佳答案

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

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

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

你能发布原始图像数据的链接吗?

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com