Kenar tespiti için Hough dönüşümünü kullanmaya çalışıyorum ve temelde degrade görüntüleri kullanmak istiyorum.
Ben görüntü verilen ana kadar ne yaptık I
büyüklüğü [M,N]
ve kısmi türev gx
, gy
yanı her bir piksel gradyan açısı hesaplanmasıdır thetas = atan(gy(x,y) ./ gx
. Benzer şekilde gradyan büyüklüğünü de hesaplıyorum magnitudes = sqrt(gx.^2+gy.^2)
.
Hough dönüşümünü oluşturmak için aşağıdaki MATLAB kodunu kullanıyorum:
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
Ortaya çıkan Hough dönüşümü mantıklı görünüyor (bkz. Http://i.stack.imgur.com/hC9mP.png ), ancak maxima'sını orijinal görüntüde kenar parametreleri olarak kullanmaya çalıştığımda, sonuçlar az çok rastgele görünüyor. Hough dönüşümünü oluştururken yanlış bir şey mi yaptım?
GÜNCELLEME : Kodumda aptalca bir hata vardı: yerine rho
hesaplandı . Yani, kosinüs ve sinüs yerine iki kosinüs kullanıyordum. Yukarıdaki kodu düzenledim ve ortaya çıkan yeni görüntü aşağıda. Bu daha iyi kenarlar vermedi.x*cos(theta)+y*cos(theta)
x*cos(theta)+y*sin(theta)
@endolith: maksimal bir değer verilir, bir kenar çizmek için hough
-Matris de rho_idx, theta_idx
I endeksleri çevirmek rho,theta
değerleri:
theta = (theta_idx -1) / 100 * pi - pi / 2;
rho = rho_idx - max_rho;
Sonunda kenarı olarak çiziyorum y= (rho - x*cos(theta)) / sin(theta)
.