7

次のシナリオについて質問があります。画像を後処理すると輪郭が得られますが、残念ながら下の行でわかるように 2 回接続されています。私が欲しいものを明確にするために、外側の線だけです。したがって、ズームインして線をマークしました。大きな画像が必要です。

この選択から私が欲しいのは、次の写真で緑色でマークした外側の部分だけです. 絵が下手でごめんなさい。;)

私は IPT で MatLab を使用しています。bwmorphということで、オプションもつけてみたhbreakのですが、エラーになってしまいました。

どうすればその問題を解決できますか? 成功した場合、それについてもう少し教えていただけますか?前もって感謝します!

心から

4

2 に答える 2

2

分岐点を直接収集できなかったため、入力画像は投稿した画像とは少し異なっているようです(分岐点が多すぎました)。そこで、問題の処理を開始するために、間引きとそれに続く分岐点の検出を検討します。また、それらを拡張して、薄くした画像から削除します。これにより、実際には、最初の画像の異なるセグメント間に接続(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つの異なるセグメントとを考えてabますh。私たちは言いab一方の端点がもう一方の端点に含まれている場合はオーバーラップします。含まれているとは、一方の開始xポイントが他方よりも小さいか等しいかどうか、および終了xポイントも大きいか等しいかどうかを意味します。あなたの場合、「山」はあなたが削除したいセグメントと重なっています。削除するそれぞれを決定するには、それらの領域を検討します。ただし、これらはセグメントであるため、面積は無意味な用語です。これを処理するために、セグメントの端点を接続し、単に内部の点を領域として使用しました。お分かりのように、下部の重なり合った部分の面積は非常に小さいので、基本的には線分と言い、「山」部分を残したまま破棄します。このステップを実行するには、画像uこれを使用すると、輪郭の追跡を開始および停止する場所を明確に示すことができるため、これは基本的に重要です。画像をそのまま使用するhと、輪郭のポイントの収集を開始および停止する場所を決定するのに問題が発生します(つまり、ラスターの順序によって誤った重複表示が発生します)。

セグメントを単一のセグメントとして再構築するには(現在、3つあります)、で破棄したポイントを考慮し、g削除hされた下部セグメントに属していないポイントを使用します。

于 2012-12-19T18:26:43.433 に答える
1

私も使いますbwmorph

%# find the branch point
branchImg = bwmorph(img,'branchpoints');

%# grow the pixel to 3x3
branchImg = imdilate(branchImg,ones(3));

%# hide the branch point
noBranchImg = img & ~branchImg;

%# label the three lines
lblImg = bwlabel(noBranchImg);

%# in the original image, mask label #3
%# note that it may not always be #3 that you want to mask
finalImg = img;
finalImg(lblImg==3) = 0;

%# show the result
imshow(finalImg)
于 2012-11-28T01:31:10.293 に答える