画像のノイズ除去でFFTを正しく適用する方法


8

画像からノイズを取り除くためのプログラム(Qtウィジェット/ c ++)を書いています。ノイズ除去方法として、非局所平均法を選択しました。この方法は、復元された画像の信じられないほどの品質を持っています(それがOpenCVで唯一のノイズ除去方法である理由です)が、計算コストが非常に高いため、この方法の多くの変更されたバリアントを作成しました(一部はマルチスレッド化、一部はアルゴリズム処理)。しかし、私はFFTを含む問題を抱えています

私はこの記事のすべての手順(1ページのみ、1430)を実行しましたが、FFTの部分を除いてすべてが完全に機能します。紙には2行しかありませんが、理解できません。

この問題は何ヶ月もの間私を悩ませてきました、どんな助けや洞察も大いに応用されます。

質問の短縮版:画像上の2つの配列の合計平方差(上に1つ、中央に1つ、値は色)をすばやく取得するにはどうすればよいですか?(O(n ^ 2)は莫大なコストであり、この種の演算はたくさんあります(上記の論文による)、これはO(n * log n)でFFTを介して行うことができます(この2つの配列が何らかの形で循環たたみ込みを形成していると言います) )

ここに画像の説明を入力してください


最終的にFFTを計算するために何をしましたか?FFTが事前計算されている場合でも、すべてのパッチ要素のポイントごとの乗算と加算には時間かかります。ここで、パッチのサイズです。これをどのように克服しましたか?O(|P|)|P|
カレー14年

回答:


5

紙の中の秘訣は次のとおりです。

  1. 計算するのは。ここで、は画像、と 2つのノイズのあるピクセル、は2Dオフセットです。パッチを定義するために使用されます。iW|I(x+i)I(y+i)|2Ixyi
  2. 式を展開すると、ます。iI2(x+i)+iI2(y+i)2iI(x+i)I(y+i)=A+B2C
  3. Aとは、2乗積分画像、つまり2乗された元の画像の積分画像を使用して計算されます。B
  4. Cは、とを中心とする2つのパッチ間のたたみ込みです。したがって、それはフーリエ領域で計算でき、乗算になります。周りのパッチ、周りのパッチのフーリエ変換を計算し、これらの結果を点ごとに乗算して、乗算結果の逆フーリエ変換を行うことにより、の値を取得します。xyCxy

フーリエ変換は、2Dデータで作業しているため、明らかに2D変換です。特定のパッチに対して取得するのは、複素数値の2D配列です。

その他の注意事項

私の意見では、この記事はNLを意味するスピードアップ戦略としては最高ではありません。2007/2008年に私が行った実験では、パッチの事前選択が(結果の速度と品質の両面で)優れていることが示されています。これらについてここでブログを書き始めましたが、残念ながら投稿を完了する時間を探しています。

元のNL平均法の論文では、興味深いブロックごとの実装について言及しています。NL平均を実装するには、基本的に2つの方法があります。

  1. 画像のすべてのピクセルにノイズ除去ループを書き込む
  2. 各パッチのノイズ除去ループを記述し、パッチを逆投影して画像を形成します。

2005年にはメモリとマルチコアCPUが高価だったため、最初の実装は元のアプローチです。一方、最近のハードウェアでは過去2年間で2番目を選択しました。これは、一般的な画像サイズと、DFT / DCTのようなドメイン変換を計算できるようにするかどうか(提案された論文やBM3Dのように)によって異なります。


あなたの答えに感謝します、それはまさに私が必要としたもので、リストの4番目の項目を除いて、すべてがかなり前に準備ができて動作していましたが、今ではより明確になりました。もう1つ質問がありますが、気にしない場合:パッチxまたはyのフーリエ変換は何を返しますか?配列、ベクトル、または単一の値?そして、逆変換を使用するには何が必要ですか?すべてのピクセル(パッチを中心に配置)のfftを事前に計算し、ノイズを除去する前に結果を2D配列に書き込んでから、それらの行列を使用して逆FFTを取得することを考えているので、これが逆FFTに十分かどうかわかりません
Shf

ああ、私は2d fftを使うべきですか、それともパッチを1d配列に変換するべきですか?ちなみに、私はとにかくこのパッチごとの実装の後に書くつもりでした。アドバイスに感謝します:)これに似たものもずっと前に-ipol.im/pub/art/2011/bcm_nlm
Shf

答えを更新しました。
sansuiso 2013年

わかりました。したがって、大量のメモリを消費しますが(m n size_of_patch size_of_patch sizeof(double))、ノイズを除去する前に、すべてのピクセルを中心としたパッチのFFTを事前計算できますが、重みをカウントする場合は、ポイントワイズ2を乗算する必要があります。複雑な配列。その後、受信した2D配列で逆FFTを実行します。誤っていない場合は、O(n ^ 2)よりも大きくなります
Shf

2
良い答えですが、がたたみ込みであることをどのようにして導き出しますか?それが書かれている方法は、ポイントごとの要素ごとの製品です。畳み込みはどこにありますか?C
TheGrapeBeyond 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.