入力フィーチャとして(ポイントではなく)ラインを使用してティーセン(ボロノイ)ポリゴンを作成しますか?


24

特定のポリゴン境界内に一連のラインフィーチャがあります。各ラインについて、レイヤー内の他のどのラインよりも可能なすべてのポイントが指定されたラインに近いポリゴンを生成したいと思います。過去にDelaunayの三角形分割を使用してポイント入力フィーチャに対してこれを実行しましたが、ラインフィーチャを使用して同様のプロセスを実行した場合、それを見つけることができませんでした。

ETA:Geogeekのソリューションは私に思いつきましたが、入力ラインの頂点の数が少ない直線セクションでは、結果のポリゴンが、本来あるべきではないラインに近づきすぎます(重なっている場合もあります)。ここで、赤い線は私の入力であり、頂点とそこから生成されたティーセンポリゴンを見ることができます。

ここに画像の説明を入力してください

おそらく、迅速で(非常に)汚い解決策は、各ラインを(ラインの頂点のみではなく)等間隔の多数のポイントセットに変換し、それらからティーセンポリゴンを生成し、元のラインIDに基づいてそれらをディゾルブすることです。


4
線分と点を含むボロノイ図は、「ポリゴン」で構成されていません。むしろ、細胞には放物線の一部を含む境界があります。 このため、ボロノイテッセレーションを作成する最も効率的で正確な方法の1つは、ラスター表現を使用することです。ESRIは、このプロシージャをユークリッド割り当てと呼びます。
whuber

回答:


11

ラスター/画像処理ソリューションを説明するために、投稿された画像から始めました。青い点、灰色の線、色の付いた領域、テキストの重ね合わせにより、元のデータよりも品質がはるかに低くなります。元の赤い線が太くなる。そのため、課題があります。それでも、ボロノイセルを高い精度で取得できます。

赤のチャネルから緑を差し引いて、最も明るい部分を3ピクセルずつ膨張および侵食することで、赤の線形フィーチャの可視部分を抽出しました。これはユークリッド距離計算のベースとして使用されました。

i = Import["http://i.stack.imgur.com/y8xlS.png"];
{r, g, b} = ColorSeparate[i];
string = With[{n = 3}, Erosion[Dilation[Binarize[ImageSubtract[r, g]], n], n]];
ReliefPlot[Reverse@ImageData@DistanceTransform[ColorNegate[string]]]

レリーフプロット

(ここに示されているすべてのコードはMathematica 8です。)

2つの隣接するボロノイセルを分離するすべてのポイントを含む明らかな「リッジ」を特定し、それらをラインレイヤーと再結合することで、処理に必要なもののほとんどが提供されます。

ridges = Binarize[ColorNegate[
   LaplacianGaussianFilter[DistanceTransform[ColorNegate[string]], 2] // ImageAdjust], .65];
ColorCombine[{ridges, string}]

合成画像

赤いバンドは線を保存できる範囲を表し、シアンのバンドは距離変換の尾根を示します。(元の行自体が途切れているため、まだ多くのジャンクがあります。)これらの隆線は、さらに拡張することでクリーンアップして閉じる必要があります(2ピクセルで実行できます)。元の線とそれらの間の尾根(そのうちのいくつかは明示的に再結合する必要があります):

Dilation[MorphologicalComponents[
  ColorNegate[ImageAdd[ridges, Dilation[string, 2]]]] /. {2 -> 5, 8 -> 0, 4 -> 3} // Colorize, 2]

これが実際に達成したことは、5つの方向付けられた線形フィーチャを識別することです。合流点から発散する3つの独立した線形フィーチャを確認できます。それぞれに2つの側面があります。右側の2つの機能の右側を同じものと見なしましたが、それ以外はすべて区別して、5つの機能を提供しました。色付きの領域は、これら5つの機能のボロノイ図を示しています。

結果

3つの線形フィーチャを区別するレイヤーに基づくユークリッドアロケーションコマンド(この図では使用できません)は、各線形フィーチャの異なる側面を区別しないため、左端のラインに隣接する緑とオレンジの領域を結合します; 右端の青緑の特徴を2つに分割します。そして、それらの分割されたピースを、反対側の対応するベージュとマゼンタの特徴と組み合わせます。

明らかに、このラスターアプローチには、任意のフィーチャのボロノイテッセレーション(ポイント、リニアピース、さらには形状に関係なく)を構築するパワーがあり、リニアフィーチャの側面を区別できます。


1
同様のソリューションがmathematica.stackexchange.com/questions/20696/…に示されています。
whuber

5

私はあなたができると思う:

  • ラインの頂点をポイント(line_points)に変換します。
  • ポイント(line_points)を使用してボロノイポリゴンを作成します。
  • ラインレイヤーから保存されたid属性を使用するか、ラインレイヤーとの空間結合によって結果のポリゴンを溶解します。

私はあなたの質問を本当に理解したことを望みます。そうでなければ、あなたのニーズをもっと説明するために図面を提供できますか。


2
あなたはそれを理解し、その解決策が私に起こったと思いますが、線の頂点が少ないという問題に遭遇します。スクリーンショットで質問を更新します。
ダンC

3
ラインに沿ってポイントをより密にした場合、これは問題なく機能します。ラスターベースのアプローチ(whuberが質問のコメントで言及しているように)ですが、これよりもはるかに効率的であると思われます。
アンディW
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.