2016-10-18 4 views
1

これは多くの話題ですが、まだ私はまだ答えられていない問題があります。 私の問題はそれ自身の方法ではなく、むしろ適用可能です: 私の画像のf(x、y)は、負または正のになることができる物理的な値を表します。中央値に相当するピークをマスクすると、逆FFTの適用後に複雑な画像が得られます。定期的なノイズのFFT除去

この縫い目はimage!= ifft(fft(image))の場合、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) 

私が持っていると、このような外観を処理した後に取得した画像を: enter image description here ストライプパターンは、私が

enter image description here を削除したいものであるこれらは、FFTに適用されるマスクです

enter image description here ストライプパターンはほとんど削除されていますが、画像は純粋にポジティブです!

コメントには、問題の適切な解決策があります。あなたが最初に元の値の間にあなたの画像を拡大縮小し、多少のように、後で再スケーリングいずれかの :あなたは2つの異なるアプローチを試みることができる

+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から生成された複雑な配列からイメージを生成したいのであれば、行く? 2番目の縫い目も面白いですが、私はそれをちょっと調べます。ありがとう! 出力を生成するためにnp.realを使用した他の記事(http://stackoverflow.com/questions/34027840/removing-periodic-noise-from-an-image-using-the-fourier-transform)を見ました画像。しかし、これはメソッドの継ぎ目がより合理的なすべての複雑な値を破棄しますか? – Sebastiano1991

+0

私はnp.realを好むべきだと思っています。私のヒューリスティックな数学的議論は次のようになります。fft(画像)が元の画像に戻ってきた場合、虚数部は存在しないはずです。 fftを変更すると、虚数部が導入され、同時にパターンが削除されます。元の画像に最も近い逆変換は、虚数部を持たないため、削除されますか?これはあまりにも多くの実験物理学者の数学が真実であるか? – Sebastiano1991

+0

np.realで問題が解決する可能性があります。私はnumpyの専門家ではありませんが、これはMATLABドキュメンタリーでこの話題について語ったものです(構文はかなり類似していますので、そこでも答えを探すことができます)。 Tbh、私はあなたが私よりもはるかにあなたを助けてくれません。 多分1つの最終的な事柄:あなたは 'ifftshift'を使わないことに気付きました。 – dennlinger

関連する問題