個々の質問に対する素早い回答
ただし、画像が各軸で同じサイズでない場合はどうしますか?
このペーパーでは、辺の長さが2のべき乗である正方形の画像を使用しています。これは説明を簡単にするためですが、アルゴリズムが機能するために必要ではありません。セクション3.1を参照してください。
一般性を失うことなく、nは2の累乗であると想定できます。
つまり、アルゴリズムが機能するためにこの仮定は必要ありません。
JFAを各軸で個別に実行しても、適切な結果が得られますか?
各軸で個別に実行すると、ピクセルの結果が不正確になる可能性が高く、ほとんどの場合、実行に時間がかかります。画像の辺の長さの1つが8(ジャンプ方向の数)未満の極端な場合、アルゴリズムはこれらの8つの方向を順番に処理するので高速になる可能性がありますが、より広い画像の場合、軸を分離するとそれらを処理する利点が失われます並行して。
私の状況では、理想的には、単一点シードと任意の形状のシードの両方をサポートすることを目指しています
この論文では、セクション6の「一般化ボロノイ図」の項で任意の形状のシードについて言及しています。
... Googleのアルゴリズムは、このような一般化されたシードをポイントシードのコレクションとして扱い、ポイントシードで得られた優れたパフォーマンスを継承することを期待しています。
したがって、任意の形状をピクセルのコレクションとしてモデル化することが目的に適していれば、アルゴリズムを調整する必要はありません。同じシード番号で位置が異なる任意の形状のシードのすべてのピクセルにラベルを付けるテクスチャをフィードするだけです。
重み付けされたシードである可能性もあります。シードへの距離は、乗算器および/または加算器によって調整され、多少の影響を与えます。
「乗法や加法などのシードの重み付け」については、セクション8を通過する可能性について、将来の潜在的な作業としてのみ言及しています。ただし、ピクセルからピクセルへ渡されるシードデータに希望の重み付けを含めることができれば、これは簡単に実装できます。
現在のアルゴリズムは<s, position(s)>
シードとその位置を指定するためにパスし、一度に1つのシードのみがピクセルごとに格納されます。これを保存に拡張<s, position(s), weight(s)>
すると、距離関数に重みを付けて、ピクセルに渡される新しいシードが現在保存しているシードよりも近いかどうかを計算するために必要なすべての情報が提供されます。
1つの乗算と1つの加算の2つの重みを含めることもできます。必要がない場合は、乗算1を1に、加算1を0に設定するだけです。次に、アルゴリズムには、乗法的に重み付けされたシード、加法的に重み付けされたシード、または一度に両方の組み合わせ、またはそれぞれのいくつかに使用される可能性が含まれます。これはちょうど必要になります
<s, position(s), multiplicative(s), additive(s)>
現在のアルゴリズムは、この新しいアルゴリズムと同等です。
<s, position(s), 1, 0>
理由の詳細な説明
ログ()
アルゴリズムは、異なる辺の長さに適合させる必要はありません
辺の長さが等しくなく、2の累乗ではない場合、アルゴリズムを適合させる必要はありません。それはすでにジャンプの方向のいくつかが画像の外に通じている画像の端のピクセルを扱います。アルゴリズムはすでに画像の外側を指す方向のシード情報を省略しているため、2の累乗ではない幅または高さは問題になりません。幅Wと高さHの画像の場合、必要な最大ジャンプサイズは
2⌈ ログ(最大(W、H))⌉ - 1
幅と高さNが等しい場合、これは次のようになります。
2⌈ ログ(N)⌉ - 1
2の累乗である辺の長さNの場合、これは
2ログ(N)− 1= N/ 2
論文で使用されているとおり。
より直感的に言えば、最大の辺の長さを次の2の累乗に切り上げ、それを半分にして最大のジャンプサイズを取得します。
最長の辺の長さがNの場合、任意のピクセルへのオフセットは0からN-1の範囲になるため、これは常に画像内の他のすべてのピクセルから画像内のすべてのピクセルをカバーするのに十分です。2の累乗の累乗の組み合わせ0からN / 2は、Nが2の累乗である場合、N-1までのすべての整数をカバーし、Nが2の累乗でない場合、カバーされる範囲は、対数の上限を取るために必要以上に大きくなる場合があります( 2の次のべき乗に切り上げます。
2の累乗ではない辺を持つ画像は、劇的に効率が悪くなることはありません
ジャンプの数は、最長の辺の長さ、たとえばLに依存します。Lが2の累乗の場合、ジャンプの数はです。Lが2のべき乗でない場合、ジャンプの数はです。かなり大きな画像の場合、これは大きな違いにはなりません。⌈ ログ(L )⌉ログ(L )⌈ ログ(L )⌉
たとえば、1024 x 1024の画像では、10回のジャンプ反復が必要になります。512 x 512の画像は、9回のジャンプ反復を必要とします。2つのサイズの間にあるものも、10回の反復が必要です。最悪の場合、2の累乗を超える画像の場合でも、513 x 513の画像のように、追加の反復は1回だけ必要です。この縮尺では、約11%多くなります(9ではなく10)。
非正方形の画像はエリアごとに効率が悪い
必要な反復回数は最長の辺の長さによって決まるため、1024 x 1024の画像にかかる時間は、1024 x 16の画像と同じになります。正方形の画像を使用すると、同じ回数の反復でより広い領域をカバーできます。
軸を分離すると品質が低下する可能性があります
ペーパーのセクション5では、起こり得るエラーについて説明します。すべてのピクセルは他のすべてのピクセルからのパスによって到達可能ですが、一部のパスは、そのシードがパス内の前のピクセルに最も近くないため、正しい最も近いシードをもたらしません。シードがそれを越えて伝播することを許可しないピクセルは、そのシードを「殺した」と言われます。ピクセルに最も近いシードがそのピクセルへのすべてのパスで削除された場合、そのピクセルは他のシードを記録し、最終的な画像に誤った色が含まれます。
最終結果を正しくするために、シードを殺さないパスが1つだけ存在する必要があります。正しくない色は、正しいシードから特定のピクセルまでのすべてのパスがブロックされている場合にのみ発生します。
パスに水平ジャンプと垂直ジャンプが交互に含まれている場合、軸を分離するとこのパスが不可能になります(すべての垂直ジャンプの前にすべての水平ジャンプが行われるため、交互ジャンプは不可能になります)。斜めジャンプはまったくできません。したがって、交互にジャンプするか、斜めのジャンプを含むパスはすべて除外されます。すべてのピクセルは他のすべてのピクセルへのパスを保持しますが、パスが少なくなるため、特定のピクセルが正しいシードを受け取るのをブロックされる可能性が高くなり、最終的な結果はエラーが発生しやすくなります。
軸を分離すると、アルゴリズムに時間がかかる可能性があります
フラッディングは並列で行われなくなり、代わりに軸ごとに繰り返されるため、軸を分離すると効率が低下する可能性があります。2Dの場合、この時間は約2倍、3Dの場合は約3倍かかります。
これは斜めジャンプの欠如によって多少緩和されるかもしれませんが、私は依然として全体的な効率の低下を期待します。