2017-01-17 12 views
1

私は重なった線の形をした画像を扱っています(左のプロット)。最終的には、単一のオブジェクトを分割する必要があります。私はこれを達成するためにハフ変換に取り組んでおり、(かなり)異なる方向のラインを見つける際にうまくいきます。 (ミドルプロット)以下のハフ空間の2つの最大値によって表される。ライン形状のオブジェクトを抽出する

houghline - full example

  • 緑および黄色の線(左プロット)と交雑(右プロット)線の太さと何かをするアプローチから生じます。私は広範なラインを抽出する方法を理解できなかったので、私はフォローアップしませんでした。
  • 「オーバーラップピクセル」を割り当てる曖昧さに気付いています。私は後でそれに取り組んでいます。

私は知らないので、1つの接続領域に含まれる線オブジェクトはいくつあるのでしょうか?私のアイデアは、最も活性度の高いハフ線に対応するオブジェクトを繰り返し抽出することです(ここでは青で塗りつぶしています)。次の反復では他の行だけが見つかるように、画像から線形オブジェクトを削除します。

しかし、どのピクセルがライン状のオブジェクトに属するのかを検出するにはどうすればよいですか?

機能hough_bin_pixels(img, theta, rho, P)hereから - 右プロットに示す)は、特定のラインに対応するピクセルを与えます。しかし、明らかに、オブジェクトを表現するには線が細すぎます。

最も強いハワイ線に沿って方向付けられたオブジェクト全体をセグメント化/検出する方法はありますか?

答えて

1

元画像の太い線がハフ変換のより広いピークに変換されることを知ることが重要です。この画像は、細い線と太い線のピークを示しています。

Thick and thin line with resulting Hough Transform

あなたが一緒のグループに各ピークのすべてのピクセル/アキュムレータビンを好きな戦略を使用することができます。 multithreshimquantizeを使用してBWイメージに変換し、次にbwlabelを使用して接続コンポーネントにラベルを付けることをお勧めします。任意の数の他のクラスタリング/セグメンテーション戦略を使用することもできます。潜在的に難しい部分は、適切なしきい値レベルを計算することだけです。あなたのアプリケーションに適した何かを得ることができない場合は、後で間違ったピクセルをいつも取り除くことができるので、あまりにも多くを含んでいるのが面倒です。ここで

は、しきい値(左)とラベル(右)

Thresholded peaksLabeled peaks

あなたはピーク領域を持ってたら、元の画像のピクセルかを調べることができますが寄与した後、ハフ変換のピークでありますhough_bin_pixelsを使用して各アキュムレータビンに転送します。次に、ピーク領域ごとに、領域の一部であるすべてのビンについてhough_bin_pixelsの結果を結合します。ここで

Reconstructed Lines

私はサンプル画像を作成するために一緒に投げたコードです。私はちょうどそれを使用していない後に、matlabに戻ってきているので、ちょっとしたコードを許してください。

% Create an image 
image = zeros(100,100); 

for i = 10:90 
    image(100-i,i)=1; 
end; 

image(10:90, 30:35) = 1; 

figure, imshow(image); % Fig. 1 -- Original Image 

% Hough Transform 
[H, theta_vals, rho_vals] = hough(image); 
figure, imshow(mat2gray(H)); % Fig. 2 -- Hough Transform 

% Thresholding 
thresh = multithresh(H,4); 
q_image = imquantize(H, thresh); 
q_image(q_image < 4) = 0; 
q_image(q_image > 0) = 1; 
figure, imshow(q_image) % Fig. 3 -- Thresholded Peaks 

% Label connected components 
L = bwlabel(q_image); 
figure, imshow(label2rgb(L, prism)) % Fig. 4 -- Labeled peaks 

% Reconstruct the lines 
[r, c] = find(L(:,:)==1); 
segmented_im = hough_bin_pixels(image, theta_vals, rho_vals, [r(1) c(1)]); 
for i = 1:size(r(:)) 
    seg_part = hough_bin_pixels(image, theta_vals, rho_vals, [r(i) c(i)]); 
    segmented_im(seg_part==1) = 1; 
end 
region1 = segmented_im; 

[r, c] = find(L(:,:)==2); 
segmented_im = hough_bin_pixels(image, theta_vals, rho_vals, [r(1) c(1)]); 
for i = 1:size(r(:)) 
    seg_part = hough_bin_pixels(image, theta_vals, rho_vals, [r(i) c(i)]); 
    segmented_im(seg_part==1) = 1; 
end 
region2 = segmented_im; 

figure, imshow([region1 ones(100, 1) region2]) % Fig. 5 -- Segmented lines 

% Overlay and display 
out = cat(3, image, region1, region2); 
figure, imshow(out); % Fig. 6 -- For fun, both regions overlaid on original image 
+0

これは実際には本当にクールなアイデアでした。線が実際に長さが異なる場合、閾値処理のアプローチは、全体的な最大値として「高く」はない局所的なHough maxima(小さな線に対応する)を隠すことができます。私はまだそれに取り組んでいますが、そうでなければこれは素晴らしいアプローチです!ありがとうございました! – Honeybear

+0

将来、この回答を参照する人にとっては、しきい値の問題を解決する良い方法は、平均シフトを使ってハフ変換の極大を見つけることです。 –

+0

こんにちは@Honeybearこの回答があなたの質問を解決した場合は、チェックマークをクリックして[受け入れ](https://meta.stackexchange.com/q/5234/179419)を検討してください。これは、あなたが解決策を見つけ出し、回答者とあなた自身の両方に評判を与えていることを広範なコミュニティに示します。これを行う義務はありません。 –

関連する問題