はじめに
私は、PTZカメラからの画像安定化のアルゴリズムについて説明している記事「 超並列画像安定化 」を読んだ後、この記事を書くことにしました。 事実、私は静止カメラからの画像を安定化するアルゴリズムを実装したことがあります。これは、 MagicBox IPビデオサーバーおよび現在働いているSynesisの他の製品で使用されています 。 このアルゴリズムは、速度特性の点で非常に成功していることが判明しました。 特に、背景に対する現在の画像の変位を見つけるためのアルゴリズムを非常に効果的に実装します。 この効率性により、オブジェクトの追跡、および不動性の確認に主要な要素を(もちろん変更を加えて)使用できるようになりました。
安定化アルゴリズムには、現在のフレームのオフセットを検出し、このオフセットを補正し、安定化が発生する背景を定期的に更新する主な要素が含まれます。 以下に、それぞれについて詳しく説明します。
図 1画像安定化は非常に便利な場合があります。
現在のフレームオフセット検出
バイアスを決定するための相関アプローチが基づく基本的なアプローチは、次のように簡単に説明できます。
1)背景画像の中央部分が撮影されます。 インデントの量は、決定したい最大のオフセットによって決定されます。 中央部分は小さすぎてはなりません。さもないと、相関関数(以下を参照)が安定した動作に十分なデータを持ちません。
2)現在のフレームでは、同じサイズの部分が選択されますが、画像の中心に対してシフトされます。
3)各オフセットについて、背景の中央部分と現在の画像の相関関係を記述する特定のメトリックが計算されます。 このために、たとえば、これら2つの画像の各ポイントの差の2乗の合計、または、たとえば、各ポイントの絶対差の合計を使用できます。
4)相関が最大になるバイアス(2次差の合計または絶対差の合計よりも小さい)は、望ましいバイアスになります。
図 2背景を基準とした現在のフレームのオフセット。
当然、このアプローチが真正面から適用されると、相関関数の速度が非常に速くなる場合があるにもかかわらず、アルゴリズムの速度は壊滅的に遅くなります。 これは驚くべきことではありません。相互に相対的な画像の可能な変位のすべてのオプションをソートする必要があるためです(アルゴリズムの複雑さはO(n ^ 2)、nは画像ポイントの数として推定できます)。
最初の最適化では、可能なすべてのオプションの完全な網羅的検索を使用するのではなく、勾配降下法を使用します。最初に、ゼロバイアスの場合は相関が3x3領域で計算され、次に最大相関を持つバイアスが選択され、ローカル最大が検出されるまでプロセスが繰り返されます。 この方法ははるかに高速ですが、最悪の場合、オフセットが大きい場合は複雑度O(n ^ 1.5)になり、これも受け入れられません。
図3相関関数の最大値の検索。 勾配降下。
この状況から抜け出す方法は、マルチスケール画像を使用することです(各ズームレベルで画像が半分に縮小されます)。 次に、最大スケールの相関の極大値を検索し、その後、より小さなスケールでそれを調整します。 したがって、アルゴリズムの複雑さはO(n)に減少しますが、これはすでにかなり受け入れられます。
図4マルチスケール画像。
サブピクセル精度
ピクセルの精度で手ぶれを補正する場合、安定した画像は非常に顕著にひきつります。 幸いなことに、これは修正できます。 最大値に近い相関関数の近傍を注意深く分析すると(図3を参照)、関数の値が最大値に対して対称ではないことがわかります。これは、最大値がその間のどこかに(3、2)にないことを示しています。そしてポイント(1、4)。 最大に近い相関関数の挙動を放物面A * x ^ 2 + B * x * y + C * y ^ 2 + D * x + E * y + F = 0で近似すると、最大の座標を調整するタスクは放物面のそのようなパラメーターの選択に縮小されます。既知のポイントでの実際の値からの偏差が最小になる場所。 経験によれば、このようにして得られた改良の精度は0.1から0.2程度であることが示唆されています。 このような精度でジッタを補正すると、安定した画像がけいれんしなくなります。
オフセット補正
次のように、シフト全体のオフセット補正を実行します。反対の符号を持つ見つかったシフトだけ現在の画像をシフトします。 エッジ付近の空の領域が背景を埋めます。 サブピクセルシフトの場合、双線形補間を使用して補正が実行されます。 ただし、安定した画像のわずかなぼかしは可能です。 これが重要な場合、バイキュービック補間を使用できます。
バックグラウンド更新
背景として、前のフレームだけを使用できます。 ただし、多くのフレームで平均化された画像を背景として使用すると、安定化の品質が著しく向上します。 背景を定期的に更新して、シーンの明るさの変化を補正することをお勧めします。 バックグラウンドを更新するときは、バックグラウンドの値が非常に対照的で不均一であることを確認する必要があります。 そうしないと、相関関数に明確な最大値がなくなり、スタビライザーの精度が大幅に低下します。 また、動いているオブジェクトがバックグラウンドに存在することは非常に望ましくありません。
モーション検出器と連携して動作する
スタビライザーがモーション検出器とペアになっている場合、それに対するバックグラウンド更新プロセスは大幅に簡素化されます。 通常、動き検出器は、多くのフレームにわたって平均化された背景をすでに持っており、それに対して動きの存在を判断します。 同じ背景をスタビライザーに使用できます。 スタビライザーからの安定した画像は、モーション検出器の誤検知の数を減らします。 また、作業中の動き検出器が動きのある領域のマスクを受け取るという事実を使用することもできます。 最後のフレームで動き検出器によって取得されたこのマスクは、動きのある領域を除外する相関関数の計算に使用できます。 これは、画像安定化装置にもプラスの効果をもたらします。
提案されたアプローチの長所:
1)高速アルゴリズム。 特に、Core i7-4470プロセッサ(1コアが含まれる)でBGRA32形式の解像度1280x720の画像安定化の場合、アルゴリズムには1.5ミリ秒が必要です。
2)サブピクセル精度の手ぶれ補正。
提案されたアプローチの欠点
1)現在の実装での画像安定化は、固定カメラでのみ可能です。
2)カメラの空間シフトのみが検出および補正され、カメラの回転は補正されません。
3)バックグラウンドは非常に明確で異質でなければなりません。そうでなければ、相関関数はしがみつきません。 そのため、暗闇や霧の中では、安定化はうまく機能しません。
4)背景は動かないはずです。 進行波の背景の安定剤も不可能です。
実装ノート
そもそも、シフトを決定するには、グレー画像のみを使用すれば十分であり、色特性は実際には精度に影響を与えませんが、自然に計算が遅くなることに注意してください。
スタビライザーを実装するときは、画像の操作に最適化された機能を使用することをお勧めします。 これらの目的でSimdライブラリを使用しました。 特に、次のものを見つけることができます。
1)SimdAbsDifferenceSumおよびSimdAbsDifferenceSumMasked-相関関数を計算します。
2)SimdReduceGray2x2、SimdReduceGray3x3、SimdReduceGray4x4、およびSimdReduceGray5x5-マルチスケールイメージの構築用。
3)SimdBgrToGray-グレー画像を取得します。
4)SimdShiftBilinear-シフトを補正します。
アルゴリズムの結果を見る
例1:
例2: