ええ、私は宇宙船からの画像で同じようなことをしなければなりませんでした。
簡単なテクニック#1:適度な幅のメディアンフィルターを使用します。たとえば、約5サンプル、つまり7です。これにより、対応する入力値とそのすぐ隣のいくつかの中央値である出力値が提供されます。それはそれらのスパイクを取り除き、ステップエッジを維持するのに良い仕事をします。
メディアンフィルターは、Matlab、Python / Numpy、IDLなど、私が知っているすべての数値計算ツールキット、およびC ++、Javaなどのコンパイル言語用のライブラリで提供されています(ただし、現在、特定の名前は思い浮かびません。 ..)
テクニック#2、おそらくそれほど良くはありません: Savitzky-Golay平滑化フィルターを使用します。これは、対応する入力サンプルとポイントの近傍(中央値フィルターのように)を使用して、各出力サンプルでデータに最小二乗多項式を効果的に適合させることによって機能します。SGスムーザーは、ピークと鋭い遷移を維持するのにかなり優れていることで知られています。
SGフィルターは通常、ほとんどの信号処理および数値処理パッケージによって提供されますが、メディアンフィルターほど一般的ではない場合があります。
テクニック#3、最も多くの作業と最も多くの経験と判断を必要とする: 先に進み、よりスムーズなもの(移動ボックス平均、ガウス関数など)を使用しますが、元のデータと平滑化されたデータをブレンドする出力を作成します。作成する新しいデータシリーズによって制御されるブレンドは、すべてオリジナル(スムージングの0%でブレンド)からすべてスムージング(100%)まで変化します。
ブレンディングを制御するには、エッジ検出器から始めてジャンプを検出します。スパイクを取り除くために、最初にデータを中央値でフィルタリングすることをお勧めします。次に、エッジ検出器の出力を広げたり(画像処理用語で拡張)、滑らかにして再正規化し、ジャンプの近くで0.0、その他の場所で1.0になるように反転します。おそらく、それらを結合するスムーズな移行が必要です。これを正しく行うのは芸術であり、データがどのように使用されるかによって異なります。私にとっては、通常、人間が表示する画像です。自動化された組み込み制御システムは、別の方法で調整すると最適に機能する可能性があります。
この手法の主な利点は、好きな種類の平滑化フィルターを接続できることです。ブレンド制御値がゼロの場合は効果がありません。主な欠点は、操作されたエッジ検出器の出力によって定義される小さな近傍であるジャンプにノイズが含まれることです。