Bagaimana menerapkan transformasi Hough berbasis gradien

9

Saya mencoba menggunakan transformasi Hough untuk deteksi tepi, dan ingin menggunakan gambar gradien sebagai dasarnya.

Apa yang telah saya lakukan sejauh ini, mengingat gambar Idari ukuran [M,N]dan derivatif parsial nya gx, gy, adalah untuk menghitung sudut gradien di setiap pixel sebagai thetas = atan(gy(x,y) ./ gx. Demikian pula saya menghitung besarnya gradien sebagai magnitudes = sqrt(gx.^2+gy.^2).

Untuk membangun transformasi Hough, saya menggunakan kode MATLAB berikut:

max_rho = ceil(sqrt(M^2 + N^2));
hough = zeros(2*max_rho, 101);
for x=1:M
    for y=1:N
        theta = thetas(x,y);
        rho = x*cos(theta) + y*sin(theta);

        rho_idx = round(rho)+max_rho;
        theta_idx = floor((theta + pi/2) / pi * 100) + 1;
        hough(rho_idx, theta_idx) = hough(rho_idx, theta_idx) + magnitudes(x,y);
    end
end

Transformasi Hough yang dihasilkan terlihat masuk akal (lihat http://i.stack.imgur.com/hC9mP.png ), tetapi ketika saya mencoba menggunakan maxima sebagai parameter edge pada gambar asli, hasilnya terlihat kurang lebih acak. Apakah saya melakukan sesuatu yang salah dalam membangun transformasi Hough?

UPDATE : Saya punya kesalahan bodoh dalam kode saya: rhodihitung sebagai x*cos(theta)+y*cos(theta)ganti x*cos(theta)+y*sin(theta). Yaitu, saya menggunakan dua cosinus alih-alih cosinus dan sinus. Saya telah mengedit kode di atas dan gambar yang dihasilkan baru di bawah. Ini tidak memberikan tepi yang lebih baik.

@endolith: Untuk memplot edge, diberi nilai maksimal di hough-matrix at rho_idx, theta_idx, saya menerjemahkan indeks ke rho,thetanilai:

theta = (theta_idx -1) / 100 * pi - pi / 2;
rho = rho_idx - max_rho;

Akhirnya saya plot tepi sebagai y= (rho - x*cos(theta)) / sin(theta).

Hasil baru

Jonas Due Vesterheden
sumber
"ketika saya mencoba menggunakan maxima sebagai parameter edge pada gambar asli" Bagaimana Anda melakukan itu?
endolith
@Jonas Karena Vesterheden Hanya ingin tahu apakah ini waktu gambar frekuensi VS doppler? ...
Spacey
@Mohammad: Bukannya aku tahu. Gambar asli dari beberapa papan sirkuit. Apa yang Anda maksud dengan "VS"?
Jonas Due Vesterheden
@JonasDueVesterheden 'VS' berarti 'versus'. (Waktu versus frekuensi doppler ') :-)
Spacey
Anda harus merapikan peta hough Anda sebelum menerapkan penindasan Non max.

Jawaban:

2

Saya agak bingung dengan pertanyaan Anda. Transformasi Hough digunakan untuk mendeteksi garis, bukan tepi.

Jika semua yang Anda inginkan adalah peta tepi, Anda hanya perlu ambang besarnya gradien, atau menggunakan sesuatu yang lebih mewah seperti detektor tepi Canny.

Jika Anda ingin mendeteksi garis lurus, Anda akan lebih baik memulai dengan peta tepi, dan kemudian menggunakan houghfungsi jika kotak alat Pemrosesan Gambar, jika Anda memiliki akses ke sana. Masalah dengan melakukan transformasi Hough pada gradien adalah bahwa piksel tepi yang membentuk garis lurus mungkin memiliki orientasi gradien yang berlawanan. Sebagai contoh, perhatikan pola kotak-kotak. Tepi antara dua baris kotak membalik orientasi tergantung pada apakah Anda memiliki kotak hitam di atas dan kotak putih di bawah, atau sebaliknya.

Mengenai implementasi Anda, saya pikir masalahnya adalah bahwa nampan di matriks Hough Anda terlalu kecil. Pada dasarnya ukuran nampan dalam dimensi rho adalah 1, dan ukuran nampan dalam dimensi theta kurang dari 2 derajat. Itu berarti bahwa orientasi gradien harus turun dengan sangat tepat untuk membentuk garis, yang jarang terjadi dalam praktik. Jika Anda menghitung rho_idx dan theta_idx sehingga nampan lebih besar, itu akan membuat detektor garis Anda lebih toleran terhadap kesalahan, dan Anda mungkin mendapatkan garis yang lebih baik.

Dima
sumber
1

Saya tidak tahu apakah ini masalah tetapi atan () hanya memberi Anda sudut dari -90 hingga +90 derajat karena ambiguitas kuadran. Untuk mendapatkan sudut gradien penuh (dari -180 hingga 180) Anda harus menggunakan atan2 ().

Hilmar
sumber
Terima kasih untuk sarannya! Seperti yang saya mengerti, itu harus cukup untuk menggunakan sudut dari -90 hingga +90 derajat, karena "arah" dari tepi tidak masalah. Saya mencoba menggunakan atan2, tetapi sepertinya tidak memperbaiki masalah.
Jonas Due Vesterheden