距離変換に利用できる最速のアルゴリズムを探しています。
このサイトによると http://homepages.inf.ed.ac.uk/rbf/HIPR2/distance.htm 、それは説明します: "距離変換はできますたった2回のパスで巧妙なアルゴリズムを使用してはるかに効率的に計算されます(例:Rosenfeld and Pfaltz 1968)。 "
周りを検索すると、次のことがわかりました: "Rosenfeld、A and Pfaltz、J L. 1968.デジタル画像の距離関数。パターン認識、1、33-61。"
しかし、1968年のものよりも優れた高速なアルゴリズムが必要だと思いますか?実際、1968年から出典を見つけることができなかったので、どんな助けでも大歓迎です。
距離関数の計算に関する新しい作業がたくさんあります。
ちなみに、特に障害物が存在する場合の距離を計算する場合は、Rosenfeldの作業の代わりにこれらを使用することをお勧めします。
このホワイトペーパーでは、既知の正確な距離変換アルゴリズムについて説明します。
「2Dユークリッド距離変換アルゴリズム:比較調査」
http://liu.diva-portal.org/smash/get/diva2:23335/FULLTEXT01
最速の正確な距離変換はMeijsterからのものです。
「線形時間で距離変換を計算するための一般的なアルゴリズム。」
http://fab.cba.mit.edu/classes/S62.12/docs/Meijster_distance.pdf
アルゴリズムの設計は、並列計算に特に適しています。
これは、Photoshopの「レイヤースタイル」をエミュレートしようとする私のオープンソースライブラリに実装されています。
OpenCVライブラリは、その概算に cv :: distanceTransform 関数を使用して、画像を左上から右下に、そしてその逆に渡すアルゴリズムを使用します。このアルゴリズムは、Gunilla Borgefors(Comput。VisionGraph。ImageProcess。343、pp 344–371、1986)の論文「デジタル画像の距離変換」で説明されています。
アルゴリズムは、いくつかの基本的なジャンプ(水平、垂直、斜め、および騎士の動き)の組み合わせによって距離を計算します。ジャンプするたびにコストが発生します。次の表は、さまざまなジャンプのコストを示しています。
+------+------+------+------+------+
| 2.8 |2.1969| 2 |2.1969| 2.8 |
+------+------+------+------+------+
|2.1969| 1.4 | 1 | 1.4 |2.1969|
+------+------+------+------+------+
| 2 | 1 | 0 | 1 | 2 |
+------+------+------+------+------+
|2.1969| 1.4 | 1 | 1.4 |2.1969|
+------+------+------+------+------+
| 2.8 |2.1969| 2 |2.1969| 2.8 |
+------+------+------+------+------+
あるピクセルから別のピクセルまでの距離は、必要なジャンプのコストの合計です。次の画像は、0セルから他のセルまでの距離を示しています。矢印はいくつかのセルへの道を示しています。色付きの数字は、正確な(ユークリッド)距離を反映しています。
アルゴリズムは次のように機能します。次のマスク
+------+------+------+
| 0 | 1 | 2 |
+------+------+------+
| 1 | 1.4 |2.1969|
+------+------+------+
| 2 |2.1969| 2.8 |
+------+------+------+
画像の左上から右下に移動します。このパスの間、マスクの境界内にあるセルは、値を保持するか(既知で小さい場合)、セルからマスク値とセル値(既知の場合)を合計して計算された値を取得します。マスク0セルの下。その後、右下から左上への2回目のパス(垂直および水平の反転マスクを使用)が実行されます。 2回目のパスの後、距離が計算されます。
私は、Vinnieの回答「線形時間で距離変換を計算するための一般的なアルゴリズム」で引用されているMeijsterのO(N)メソッドを実装しました。」 http://fab.cba.mit。 edu/classes/S62.12/docs/Meijster_distance.pdf
良い点は、各ピクセルラインを個別に計算して、非常に効率的に並列化できることです(これは分離可能な方法です)。 12個のCPUコアで実行されている場合、1000 ^ 3ボリュームイメージの距離フィールドは数秒で計算されます。
2012年にさかのぼるFelzenszwalbとHuttenlocherの「サンプル関数の距離変換」(bw1024の回答で引用)のソリューションは、まったく同じアイデアに基づいています。興味深いことに、彼らは12年前に行われたMeijsterの仕事を引用していません。
「GPU加速高速方向面取りマッチングアルゴリズムと高度に最適化されたCPU実装との詳細な比較」では、MichaelRauterとDavidSchreiberが、「距離マップを計算するための統合線形時間アルゴリズム」の距離変換アルゴリズムを使用したパフォーマンスについて説明しています。
2012年には、マルチスレッドなしのIntel Xeon CPUで8つの距離変換(720×576)に約15msを使用しました。 GPU GTX 460では、7ミリ秒でそれを実行しました。
私はより速いdtを見たことがありません。