6

これがここSOで有効かどうかはわかりませんが、使用する正しいアルゴリズムについて誰かがアドバイスできることを望んでいました.

次のRAWデータがあります。 ここに画像の説明を入力

画像では「ステップ」を見ることができます。基本的に、これらの手順を取得したいのですが、その間のすべてのデータの移動平均を取得します。次の画像では、移動平均を確認できます。

ここに画像の説明を入力

ただし、「ステップ」では、移動平均が勾配を減少させ、高い垂直方向の勾配を維持したいことに気付くでしょう。

大きな垂直方向の「オフセット」を考慮に入れるが、他のデータを平滑化する平滑化手法はありますか?

4

2 に答える 2

2

ええ、私は宇宙船からの画像で同じようなことをしなければなりませんでした。

簡単なテクニック#1:適度な幅のメディアンフィルターを使用します。たとえば、約5サンプル、つまり7です。これにより、対応する入力値とそのすぐ隣のいくつかの中央値である出力値が提供されます。それはそれらのスパイクを取り除き、ステップエッジを維持するのに良い仕事をします。

メディアンフィルターは、Matlab、Python / Numpy、IDLなど、私が知っているすべての数値計算ツールキット、およびC ++、Javaなどのコンパイル言語用のライブラリで提供されています(ただし、現在、特定の名前は思い浮かびません。 ..)

テクニック#2、おそらくそれほど良くはありません: Savitzky-Golay平滑化フィルターを使用します。これは、対応する入力サンプルとポイントの近傍(中央値フィルターのように)を使用して、各出力サンプルでデータに最小二乗多項式を効果的に適合させることによって機能します。SGスムーザーは、ピークと鋭い遷移を維持するのにかなり優れていることで知られています。

SGフィルターは通常、ほとんどの信号処理および数値処理パッケージによって提供されますが、メディアンフィルターほど一般的ではない場合があります。

テクニック#3、最も多くの作業と最も多くの経験と判断を必要とする: 先に進み、よりスムーズなもの(移動ボックス平均、ガウス関数など)を使用しますが、元のデータと平滑化されたデータをブレンドする出力を作成します。作成する新しいデータシリーズによって制御されるブレンドは、すべてオリジナル(スムージングの0%でブレンド)からすべてスムージング(100%)まで変化します。

ブレンディングを制御するには、エッジ検出器から始めてジャンプを検出します。スパイクを取り除くために、最初にデータを中央値でフィルタリングすることをお勧めします。次に、エッジ検出器の出力を広げたり(画像処理用語で拡張)、滑らかにして再正規化し、ジャンプの近くで0.0、その他の場所で1.0になるように反転します。おそらく、それらを結合するスムーズな移行が必要です。これを正しく行うのは芸術であり、データがどのように使用されるかによって異なります。私にとっては、通常、人間が表示する画像です。自動化された組み込み制御システムは、別の方法で調整すると最適に機能する可能性があります。

この手法の主な利点は、好きな種類の平滑化フィルターを接続できることです。ブレンド制御値がゼロの場合は効果がありません。主な欠点は、操作されたエッジ検出器の出力によって定義される小さな近傍であるジャンプにノイズが含まれることです。

于 2012-11-01T03:26:30.180 に答える
2

最初にステップを検出してから、各ステップを個別に平滑化することをお勧めします。

スムージングの方法を知っていて、エッジ/ステップの検出も非常に簡単です (たとえば、こちらを参照)。典型的なエッジ検出スキームは、データを平滑化してから、いくつかのフィルター (たとえば、ステップがどこにあるかを示す配列 [-1,1]) で乗算/畳み込み/クロスコアレートすることです。数学的な文脈では、これはプロットの導関数を調べて変曲点を見つけることと見なすことができます (一部のフィルターの場合)。

別の「ハックな」解決策は、移動平均を行い、外れ値を平滑化から除外することです。いくつかのしきい値tを使用して、外れ値が何であるかを判断できます。言い換えると、値vを持つ各点pについて、その周囲のx個の点を取り、 v - tv + tの間にある点のサブセットを見つけ、これらの点の平均をpの新しい値として取得します。

于 2012-11-01T03:08:08.517 に答える