python:图像的带通滤波器

时间:2015-08-11 21:48:57

标签: python numpy image-processing filter convolution

我有一个带有成像工件的数据图像,它是一个正弦背景,我想删除它。由于它是一个单频正弦波,傅里叶变换和带通滤波器或“陷波滤波器”#34; (我认为我在+ -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)为了更加确定在不需要的频率上的抑制,我做了一个布尔带通#'掩码并将其应用于数据,但傅立叶变换忽略掩码。

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

不幸的是,(但反思也不出所料)结果如下所示:

The result of a brickwall bandpass filter.

左图是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滤镜吗?

0 个答案:

没有答案