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