ピークデータを減らすだけでローパスフィルターをかけるにはどうすればよいですか?


16

これらの制約/品質メトリックを使用して、ローパスフィルターしたい2D画像があります。

  1. 画像に光を「追加」できないため、結果の各ピクセルは入力の対応するピクセル以下でなければなりません。
  2. ローパスカットオフ周波数は、実験するためのパラメーターである必要があります
  3. このフィルターを繰り返し適用しても、結果が大きく変わることはありません。
  4. このアルゴリズムの実行にかかる時間(5MPixイメージの場合は5分が妥当と思われる)
  5. 除去される光の量を最小限に抑えます。

以下は、私が試したいくつかのアプローチとその欠点です。

  1. 通常のガウスフィルター。次に、制約1に準拠するように結果をプルダウンします。これは最初の3ポイントに非常によく適合しますが、必要以上に多くの光を減らします。

  2. 「上」の放物線を「低」点と「下」の放物線の間に合わせて滑らかにします。これは1Dでうまく機能しますが、最初に水平に適用し、次に垂直に適用すると2Dで悪い結果になります。時間がかかりますが、私のアプリケーションにとってはそれほど長くはありません。ただし、このフィルターを繰り返し適用すると、結果が大幅に変わります。(1D)入力が完全な「下向き」放物線である場合(これはフィルタリングしないでください)、開始/終了にある2つの「上向き」放物線に置き換えられます。

  3. 最適なパラメーターを見つけるために、2Dの「基本」関数と線形解法の他の形式を使用します。これは現在のところアイデアであり、まだ実装/テストされていません。

私の信号処理の経験領域はほとんど画像処理のみであるため、信号処理の他の分野で活躍する専門家の意見を取り入れて、この問題の代替案を見つけたいと考えています。

更新2011/08/18

現在の反応に基づいて、典型的な入力のグラフと、最初に説明した3つのアプローチの結果とこれまでに受け取った提案を追加することで、物事をもう少し明確にすることにしました。比較しやすいように、これらの例では1Dフィルタリングのみを使用しました。

入力データ: 入力データ

ガウスフィルター +要件(1)に準拠するようにダウンさせます。
それを下げると、右側で不必要な減光が生じることがわかります。 フィルタリングされたガウス

放物線
私が考える限り、これは非常に優れています。悲しいことに、最初に水平方向を適用してから垂直方向に適用しても、2Dに完全には変換されません。この場合、浮動小数点解像度で近似放物線を評価できることもわかります。これは小さな利点ですが、絶対に必要というわけではありません。 放物線フィッティング

グレースケールエロージョン
rwongからの提案に基づいて、グレースケールエロージョンを試しました。「適合」放物線と同じ放物線形状の構造要素を使用しました。結果はほぼまったく同じなので、これは有望に見えます。ただし、まだいくつかの問題があります。1.構造化要素が「十分な大きさ」ではありませんでした(すでに801ピクセルの幅でした)1.「上向き」放物線しかありません。次へ。 グレースケール侵食

中央値フィルタリング
完全を期すためにのみ含まれていますが、実際に必要なものではありません。 メディアンフィルター

生データ
生の入力データ+さまざまなpythonコマンドをpastebinに貼り付けたため、同じデータを試すこともできます。
http://pastebin.com/ASnJ9M0p


1
制限1と5についてもう少し説明できますか?彼らは(一見)矛盾しているように見えます。
ピーターK。

「このアルゴリズム」の意味を誤解している可能性がありますが、5 MPの5分間はローパスフィルターを適用するのに非常に時間がかかるようです。
bjoernz

回答:


8

あなたの試み#2には確かに2Dバージョンがあります-理論的には似ていますが、2つの1D操作に分解することはできません。「2Dグレースケールモルフォロジーフィルタリング」についてお読みください。曲線近似よりも高速です。

中央値フィルタリングは、スペックルを削除しようとしている場合にも役立ちます。中央値フィルタリングのより高度な形式は、「順序フィルタリング」です。

すべての場合において、要件#1は、出力と入力の間のピクセル単位の最小値を取ることにより、簡単に満たすことができます。これは重要な品質基準ですが、アルゴリズムの選択を制限するものではありません。


ガウスフィルター(および他の多くの有用なフィルター)は分解できます(最初に2Dから1D操作、次にフーリエ変換を介して)。それらの有用性。


こんにちは、グレースケールの形態学的フィルタリングへのポインターに感謝します。ウィキペディアの説明は興味深いようで、私はそれを調査します。ただし、OpenCVドキュメントへのリンクでは、グレースケールフィルタではなく、通常の形態フィルタのみが表示されます。このオプションを確実にチェックし、結果をお知らせします。ありがとう。
ピーターヤンBusschaert

6
rwongのメディアンフィルタリングの提案はまったく役に立ちますか?データの簡単な例と、取り出したいものの「偽の」例を提示することで、達成しようとしていることについてもう少し説明することが役立つ場合があります。
ピーターK.

サンプルデータとさまざまな提案の結果で質問を更新しました。事態がより明確になったことを願っています。
ピータージャンBusschaert

2

スムージングスプラインを使用することをお勧めします。

Matlab File Exchange の堅牢なスプラインスムージング関数SMOOTHN(完全なソースコードが含まれているため、必要に応じて別の場所に再実装できる)を使用して、Matlabを使用してこれを行う方法は次のとおりです。n次元データでも機能することに注意してください。

%# - get inputlist from pastebin

%# - smoothen data. Lower factor means less smooth
smoothingFactor = 1000;
smoothData = smoothn(inputlist,smoothingFactor);

%# - shift down
smoothData = smoothData - max(inputlist-smoothData);

%# - show results
plot(inputlist,'b'),hold on,plot(smoothData,'r')

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


あなたの提案をありがとう、私はそれを調査します。あなたのグラフから、あなたの例よりもはるかに高いsmoothingFactorが必要なようです。x = 700の周りの急なエッジは削除されず、はっきりと見えるようになります。また、x = [0,400]の初期バンプはまったく削除されません。これは他の(ローパスフィルター+下に移動する)アプローチと同じ問題があると思いませんか?2つのグラフ間のグローバルオフセットを確認できます。これは、より高いsmoothingFactorを使用すると増加する可能性があります。
ピータージャンBusschaert

@ Pieter-JanBusschaert:ああ、最初のピークはどういうわけか役に立つと思った。とにかく、すべてのローパスフィルターと下への移動は、〜650での急な上昇に問題があります。この部分はより平坦になるため、曲線を大きく下に移動する必要があります。メディアンフィルターとそれに続く平滑化スプラインが少し役立ちます。
ジョナス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.