2017-05-14 6 views
5

あなたが知っているようにイメージを作っていますが、この瞬間に私は次の問題に直面しています。イメージに見られる線の直径をどのように測定するのか分かりません。 Pythagorasの、しかし私はイメージでそれを行うことが可能かどうかわからない、例えばこの場合、イメージは太い線を持っていますが、行が行われるよりも薄い場合には?イメージ内の線の直径を取得する方法は?

Example image

直径が変化するクロスがあった場合、私は次の画像でそれを示すことは明らかであるので、私は、ラインが一人であるときの直径を知っていただきたいと思います。

あなたは2つの物事のいずれかを行うことができ厚さを推定したいライン上の任意の地点で:ここで

diameter

+1

あなたが実際に本当に交差点を見つけようとしている:

img = imread('qGs5t.png'); % Load RGB image bw = ~im2bw(img); % Convert to black and white and invert bw = imclose(bw, strel('disk', 3)); % Morphological close to remove noise distImage = bwdist(~bw); % Distance transform maxDist = double(max(distImage(:))); % Find maximum distance measure diamImage = 2.*bw.*imdilate(distImage, strel('disk', floor(maxDist))); % Dilate and mask imagesc(diamImage); % Display image colorbar; % Display color bar dcmObj = datacursormode(gcf); % Create data cursor object... set(dcmObj, 'Enable', 'on'); % ... and enable to select points 

そして、ここで選択した時点での画像だ(「インデックス」値は、おおよその直径ですか)?多分、線の太さのジャンプではなく、スケルトン化と交差点の検索を検討してください。 –

答えて

2

は、解像度や厚さは、「十分に大きい」のときのための簡単なハックです:

1)が0と180の間のすべての角度で、その点から線をまたがるし、元のラインとの最短の重なりをもたらすラインを見つけ、それは厚さ

2であろう)をまたがりますその点から円を描けば、円が線と重なっていないときは、完全に重なり合うように再配置します。あなたが完全にオーバーラップするようにそれをもう一度再センタリングすることが不可能な場合は、オーバーラップを持つことができた直径が最も良い線の太さです

1

線の太さの見積もりを表示する方法の1つはbwdistを使用して、ラインの各ポイントの最も近いエッジまでの距離を計算し、次にimdilateを使用して、ラインの幅を横切る最大値(ラインの中心に沿って走る)を滑らかにします。線上の点を選択すると、おおよその直径が表示されます(これは、ジョインでのように、直径間の遷移の近くで少しずれます)。ここでは例です:

enter image description here

+0

しかし自動化したい場合は、それ自身で行の直径を抽出し、それをリストやハッシュマップに保存してください(どの行識別子がどの太さであるか知っています) – AlexZ

+0

@AlexZ:もし必要ならそれを自動化するには、どのようにしてそれをやりたいのか、より具体的にする必要があります。直径を測定する線に沿ってポイントを与えるつもりですか?それらが結合されているポイントで線が壊れ、各セグメントに対して別々の直径測定が行われるようにしますか?線の直径はその長さに沿って最大または平均直径として報告されるべきか? – gnovice

関連する問題