【问题标题】:FFT removal of periodic noiseFFT 去除周期性噪声
【发布时间】:2017-02-27 13:57:51
【问题描述】:

这是一个讨论很多的话题,但我碰巧有一个问题尚未得到解答。 我的问题不是它本身的方法,而是它的适用性: 我的图像的 f(x,y) 表示可以是负或正的物理值。当我屏蔽与中位数相对应的峰值时,在应用逆 FFT 后,我得到了一个复杂的图像。

这与 image != ifft(fft(image)) if image != image 合乎逻辑,因此它很可能是复杂的结果?

因此,我获取图像数组的绝对值,并得到一个干净整洁的图像。但是通过获取图像的 abs 我已经失去了负值!

我的代码很复杂,并且使用多个图像来找到正确的遮罩位置,因此我将分解为要点:

def everything(fft,fftImage,sizeOfField,shapeOfFFT):
max_x = []
max_y = []
median = np.median(fft)

threshold = 500
#correctLocalMax() holds several subfunctions that look for the propper max_x and max_y. This works fine and returns 2 lists max_x,max_Y that contain the coordiantes of the max's
max_x,max_y = correctLocalMax(iStart = 0,iStop = 30, jStart =0 , jStop = shapeOfFFT[1],threshold=threshold, max_x = max_x, max_y = max_y)

for i in range(len(max_x)):
    for k in range(sizeOfField):
        for l in range(sizeOfField):
            fftImage[max_x[i]+k][max_y[i]+l] = median

return(fftImage)

image, coverage, stdev = pickleOpener(dataDir,i)
field = getROI(image,area,i0,j0)

fftImage = np.fft.fft2(image)
fftImage = np.fft.fftshift(fftImage)

fft = np.fft.fft2(coverage)
fft = np.fft.fftshift(fft)

fftMod = everything(fft, fftImage, sizeOfField, shapeOfFFT)
imageBack = np.fft.ifft2(fftMod)
imageBack = np.abs(imageBack)
field = getROI(imageBack,area,i0,j0)

我拥有和处理后得到的图像如下所示: 条纹图案是我要删除的图案

这些是应用于 FFT 的掩码

条纹图案大部分被移除,但现在图像是纯正的!

您可以在 cmets 中找到问题的正确解决方案!

【问题讨论】:

  • 这是一个非常好的问题,并且有一个很好的答案。这篇博文用非常笼统的术语解释了正在发生的事情以及如何解决它:blogs.mathworks.com/steve/2010/07/16/complex-surprises-from-fft 但它是一维的,并没有解决您要解决的问题。您可以将原始图像数据发布在某处(带有条纹)吗?然后我可以向您展示如何调整您的遮罩以从 IFFT 中获得仅真实的输出。
  • 别再问数据了,我重新阅读了关于correctLocalMax 是一个复杂函数的帖子。基本问题是,当您将频谱屏蔽为零时,您需要确保保留频谱的共轭对称性。
  • 令我困惑的是:您的光谱(fft2 的输出,您的 fftMod)应该已经是共轭对称的:其中的峰(这里对应于您的条纹)应该是左对称的从右到右和反对称自上而下。但是您的correctLocalMax 似乎返回了非共轭对称的掩码?如果你解决了这个问题,那么你的代码应该可以工作。
  • 答案也很棒!这确实达成了交易,我只需挤压correctLocalMax 即可返回对称补丁,效果很好!

标签: python image-processing fft


【解决方案1】:

您可以尝试两种不同的方法: 要么先在原始值之间缩放图像,然后再重新缩放,有点像这样:

max_val = max(max(A))
min_val = min(min(A))
% normalize to [0,1]
image = norm(image)
% do your stuff here
% then rescale to original values
image = min_val + (max_val - min_val).*image / (max_val - min_val)

另一种方法是首先保存哪些值为负数。 虽然我建议检查它们是否在您的函数调用期间被更改以避免恢复您的噪音

【讨论】:

  • 你好,关于第一个想法:我也在考虑同样的问题,但这是否克服了一般问题 - 据我所知,如果我想从 FFT 生成的复杂数组中生成图像绝对值是要走的路吗?第二个也很有趣,我会研究一下。谢谢!我在其他帖子(即stackoverflow.com/questions/34027840/…)中看到人们使用 np.real 来生成输出图像。但是,这会丢弃所有复杂值,哪种方法接缝更合理?
  • 我开始认为应该更喜欢 np.real。我的启发式数学论证是这样的:如果将 fft(image) 转换回原始图像,则不应有任何虚部。 fft 的变化引入了虚部,同时去除了模式:最接近原始图像的反向变换将没有虚部->因此放弃它?这是不是太多实验物理学家的数学是真实的?
  • np.real 可以解决您的问题。虽然我不是 numpy 方面的专家,但我相信这就是 MATLAB 纪录片中关于这个主题的内容(语法一开始就非常相似,所以也许你也可以在那里寻找答案)。 Tbh,我真的不能帮助你比我已经做过的更多了。也许最后一件事:我注意到你不使用ifftshift,所以你也可以调查一下
猜你喜欢
  • 1970-01-01
  • 2021-09-05
  • 2016-03-05
  • 2021-10-03
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 2021-12-07
  • 2011-10-15
相关资源
最近更新 更多