2016-08-16 7 views
2

私はバイナリイメージを太くしています。私はラベルnピクセルを各方向に成長させたいと思っていました。MATLABで形状を維持しようとする際の形態的な肥厚/拡張

オリジナル画像:

Original label image

が最初に私は、関数bwmorph(I、25 'を厚く')を使用して、この画像ました:

After morphological thickening

無意味です。太い部分は構造要素[0,1,0; 1,1,1; 0,1,0]を使用しているように見えるので、常に円をダイヤモンドに変換します。前述の構造化要素を持つimdilateの結果は同じです。

次の例では、元のイメージをn = 25回繰り返し構造化要素[1,1,1; 1,1,1;元の形状が今完全に消えている

iterative dilation

:1,1,1]とは、以下の画像を得ました。

私は、膨張がいつも境界をある程度歪ませることを理解します。私は、構造要素「ディスク」(R = 5、5回を拡張した)で実験し、かなり良い結果を得た:

enter image description here

はそれを取得として、このように良いですか?オリジナルの円形を可能な限り保存したい場合、どの構造要素を選択する必要がありますか?特定の拡張距離(10から100まで変化し、ラベルは円形から楕円形まで変化する)に対して正しいサイズを見つけるための親指の良いルールはありますか?元の形を維持しようとしている間に、すべての方向でバイナリイメージを成長させるより良い方法はありますか?

構造要素をより適切なものに変更しながらオイラーの特性を保存する方法がありますか?

+0

輪郭をフィットして滑らかにします。 –

答えて

2

これを試してみてください:私はそれを拡張するための画像そのものを使用しています

bw = imread('bw.png'); 
figure; imshow(imdilate(bw, strel('arbitrary', bw))) 

。これは、より形状保持成長を与える:

UPDATE:以下の出力を有する

figure; imshow(imdilate(bw, strel('arbitrary', imresize(bw, 0.5)))) 

@Tapioが言ったように、一方が容易 imresizeを使用してサイズ変更因子を調整することができます

enter image description here

+1

これは非常にうまく動作します。 imdilate(bw、strel( '任意'、imresize(bw、0.1)))は、境界線をそのまま維持し、成長のサイズを調整することができます。 – Tapio

+0

あなたが正しいです、 'imresize'を使う方がずっと便利です。私は私のポストを更新します。 – erfan

1

ユニタリ構造要素のみを使用すると、常に直面しますあなたが説明した問題。サイズNの構造要素で形状を拡張したい場合は、サイズ1の構造要素のN倍を使用しないでください。そうしないと、予期しない予期しない変形に終わります。

サイズNの拡張を行う場合は、半径Nのディスクを試してください。ただし、処理する時間は長くなります。

他の解決策は、距離マップを使用することです。形状がシード(距離0)である場合、Nより小さいすべての距離が結果になります。それは、サイズNの拡張にかなり似ています。

+0

距離地図は非常に便利ですね!しかしこの場合、元の画像は〜2000x1000であり、主に0である。なぜなら、座標を別々に追跡することなく、ラベルをrigb画像と重ね合わせることができるので便利であるからである。だから、距離の変換を行うことは、実際には、少なくとも私がしたテストでは、大きなstrel拡張よりも大きさが遅いオーダーです。 – Tapio

+0

距離マップは変換を計算するための単純な意味であり、単独では結果ではありません。距離マップを計算すると、ラベルが見つかります。 2000x1000の画像上の距離地図を計算するのは非常に速いはずです。 – FiReTiTi

+0

もちろん、わかった。私の場合、私のマシンでいくつかのテストを実行すると、最初の距離の変換は、通常、Nサイズのディスクで拡張するよりも遅くなりました。両方とも速かったので問題ではなかった。ちょうど大きなディスクで拡張することが実行可能であることに気づいた。 – Tapio

関連する問題