サークルベースのスケルトン化のデモンストレーション

Dec 03 2020

スケルトン化(または中間軸変換)は、領域の「中間」軸(マスクとして表される)を見つけるプロセスです。これはSkeletonTransform、によって実行されます。これは、「フロンティア」が出会うまでマスクを薄くすることで機能するようです。ここで、中間軸が定義されます。

私の懸念である、成長する円に基づく別の方法があります。

馬の頭のこのマスクを考えてみましょう。

マスクの境界に接する小さな赤い円から開始するとします(つまり、以下に示すように、少なくとも2点でマスクの境界に接触します)。

この代替方法では、円の半径を段階的に増やし、この2接線状態を維持するように、新しい中心の位置を自動的に調整します。

上の画像の例は、いくつかの候補円の中心を選択し、2つ(またはそれ以上)の点がマスクの境界に接触するまで半径を大きくすることに基づくハック...応急修理...です。

このプロセスを適切かつアルゴリズム的に実行したいと思います。

私の一般的なアプローチは、現在の最大の円を取得し、その半径を少しずつ(たとえば、1ピクセルずつ)インクリメントしてから、バイタンジェンシーを保持する現在の最大の中心に最も近い円の中心を検索することでした。Mathematicaには効率的なコードを作成できる巧妙な領域ベースのプリミティブがあると思いますが、残念ながら私は領域ベースの計算に精通していません。さらに、などの関数RegionMemberQは、バイタンジェンシーに直接対応していません。

最終的には、上記のように、円と関連する線のリンクセンターに色を付けたいと思います。


@billsのRidgeFilter(私にとって新しい)提案は本当に役に立ちました!

しきい値などを微調整する必要があります。

回答

2 bills Dec 03 2020 at 06:48

それはあなたが探しているすべてを与えるわけではないかもしれませんが:

img = Import["https://i.stack.imgur.com/zV7QC.png"];
RidgeFilter[DistanceTransform[img],0.5] // ImageAdjust

これらは尾根であり、あなたのサークルの中心となるはずです。半径は、これらの中心での距離変換画像の値になります。