2016-10-18 149 views
1

這是一個非常討論的主題,但我碰巧遇到了尚未回答的問題。 我的問題不是它自我的方法,而是它的適用性: 我的圖像的f(x,y)表示物理值,可能是負值或正值。當我屏蔽與中位數相對應的峯值時,在應用逆FFT之後,我得到一個複雜的圖像。FFT去除週期性噪音

如果圖像!=圖像,這個接縫就像圖像一樣邏輯!= ifft(fft(image)),因此它可能很複雜?

因此,我把我的圖像數組的絕對值,並得到一個很好地清理圖像。但通過採取圖像的絕對我已經失去了負面的價值!

我的代碼是複雜的,並且使用多個圖像,以找到正確的位置在哪裏掩蓋,所以我會分解要領:

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) 

的圖片我已經和處理的樣子之後得到: enter image description here 條紋圖案是我希望刪除

enter image description here 的那些這些是施加到FFT掩模

enter image description here 條紋圖案大多被刪除,但現在圖像純粹是正面的!

您可以在評論中找到正確的解決方案!

+0

這是一個非常好的問題,並且有很好的答案。這篇博客文章解釋了發生了什麼,以及如何用非常通用的術語解決它:http://blogs.mathworks.com/steve/2010/07/16/complex-surprises-from-fft/但它是1D,並沒有解決你正試圖解決的問題。你可以將原始圖像數據發佈到某處(帶有條紋)嗎?然後,我可以向您展示如何調整您的掩模,以便僅從IFFT獲取僅實數輸出。 –

+0

沒關係詢問數據,我重新閱讀了關於'correctLocalMax'是多麼複雜的函數。基本問題是,當您將光譜掩蔽爲零時,您需要確保保留光譜的共軛對稱性。 –

+1

令我困惑的是:你的頻譜('fft2'的輸出,你的'fftMod')應該已經是共軛對稱的:其中的峯值(這裏對應於你的條紋)應該是左對稱和反 - 從上到下對稱。但是你的'correctLocalMax'似乎返回不是共軛對稱的掩碼?如果你解決這個問題,那麼你的代碼應該可以工作 –

回答

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) 

另一種方法是保存該值,其中陰性第一名。 儘管我建議檢查它們在函數調用過程中是否發生了變化,以避免恢復噪音

+0

你好,關於第一個想法: 我在想同樣的事情,但是這是否克服了一般問題 - 據我瞭解,如果我想從FFT生成的複數組中生成圖像,絕對值是去? 第二個接縫也很有趣,我會仔細研究一下。謝謝! 我在其他帖子中看到(即http://stackoverflow.com/questions/34027840/removing-periodic-noise-from-an-image-using-the-fourier-transform)人們使用np.real生成輸出圖片。然而,這拋棄了所有複雜的價值哪個方法更合理? – Sebastiano1991

+0

我開始認爲應該更喜歡np.real。我的啓發式數學論證如下:如果fft(圖像)被變換回原始圖像,則不應該有任何虛部。 fft的變化引入虛部,同時去除圖案:最接近原始圖像的後變換不會有虛部 - >因此將其刪除?這實驗物理學家是否過於真實? – Sebastiano1991

+0

np.real可以解決您的問題。雖然我不是numpy的專家,但我相信這是在MATLAB的紀錄片中關於這個主題的講述(語法非常類似於開頭,所以也許你也可以在那裏尋找答案)。 Tbh,我不能比我已經做的更多地幫助你。也許最後一件事:我注意到你不使用'ifftshift',所以你也可以考慮一下 – dennlinger