分岐点を直接収集できなかったため、入力画像は投稿した画像とは少し異なっているようです(分岐点が多すぎました)。そこで、問題の処理を開始するために、間引きとそれに続く分岐点の検出を検討します。また、それらを拡張して、薄くした画像から削除します。これにより、実際には、最初の画像の異なるセグメント間に接続(4または8)がないことが保証されます。
f = im2bw(imread('http://i.imgur.com/yeFyF.png'), 0);
g = bwmorph(f, 'thin', 'Inf');
h = g & ~bwmorph(bwmorph(g, 'branchpoints'), 'dilate');
切断されたセグメントを保持するためh
、次の操作ですべてのセグメントのエンドポイントが収集されます。
u = bwmorph(h, 'endpoints');
今、実際にあなたの問題を解決するために、私はあなたが捨てたいものについていくつかの簡単な分析をしました。の2つの異なるセグメントとを考えてa
みb
ますh
。私たちは言いa
、b
一方の端点がもう一方の端点に含まれている場合はオーバーラップします。含まれているとは、一方の開始xポイントが他方よりも小さいか等しいかどうか、および終了xポイントも大きいか等しいかどうかを意味します。あなたの場合、「山」はあなたが削除したいセグメントと重なっています。削除するそれぞれを決定するには、それらの領域を検討します。ただし、これらはセグメントであるため、面積は無意味な用語です。これを処理するために、セグメントの端点を接続し、単に内部の点を領域として使用しました。お分かりのように、下部の重なり合った部分の面積は非常に小さいので、基本的には線分と言い、「山」部分を残したまま破棄します。このステップを実行するには、画像u
これを使用すると、輪郭の追跡を開始および停止する場所を明確に示すことができるため、これは基本的に重要です。画像をそのまま使用するh
と、輪郭のポイントの収集を開始および停止する場所を決定するのに問題が発生します(つまり、ラスターの順序によって誤った重複表示が発生します)。
セグメントを単一のセグメントとして再構築するには(現在、3つあります)、で破棄したポイントを考慮し、g
削除h
された下部セグメントに属していないポイントを使用します。