元画像の太い線がハフ変換のより広いピークに変換されることを知ることが重要です。この画像は、細い線と太い線のピークを示しています。
あなたが一緒のグループに各ピークのすべてのピクセル/アキュムレータビンを好きな戦略を使用することができます。 multithreshとimquantizeを使用してBWイメージに変換し、次にbwlabelを使用して接続コンポーネントにラベルを付けることをお勧めします。任意の数の他のクラスタリング/セグメンテーション戦略を使用することもできます。潜在的に難しい部分は、適切なしきい値レベルを計算することだけです。あなたのアプリケーションに適した何かを得ることができない場合は、後で間違ったピクセルをいつも取り除くことができるので、あまりにも多くを含んでいるのが面倒です。ここで
は、しきい値(左)とラベル(右)
あなたはピーク領域を持ってたら、元の画像のピクセルかを調べることができますが寄与した後、ハフ変換のピークでありますhough_bin_pixels
を使用して各アキュムレータビンに転送します。次に、ピーク領域ごとに、領域の一部であるすべてのビンについてhough_bin_pixels
の結果を結合します。ここで
私はサンプル画像を作成するために一緒に投げたコードです。私はちょうどそれを使用していない後に、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
これは実際には本当にクールなアイデアでした。線が実際に長さが異なる場合、閾値処理のアプローチは、全体的な最大値として「高く」はない局所的なHough maxima(小さな線に対応する)を隠すことができます。私はまだそれに取り組んでいますが、そうでなければこれは素晴らしいアプローチです!ありがとうございました! – Honeybear
将来、この回答を参照する人にとっては、しきい値の問題を解決する良い方法は、平均シフトを使ってハフ変換の極大を見つけることです。 –
こんにちは@Honeybearこの回答があなたの質問を解決した場合は、チェックマークをクリックして[受け入れ](https://meta.stackexchange.com/q/5234/179419)を検討してください。これは、あなたが解決策を見つけ出し、回答者とあなた自身の両方に評判を与えていることを広範なコミュニティに示します。これを行う義務はありません。 –