Saya mencoba menggunakan transformasi Hough untuk deteksi tepi, dan ingin menggunakan gambar gradien sebagai dasarnya.
Apa yang telah saya lakukan sejauh ini, mengingat gambar I
dari 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: rho
dihitung 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,theta
nilai:
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)
.