Degrade tabanlı bir Hough dönüşümü nasıl uygulanır?


9

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 Ibüyüklüğü [M,N]ve kısmi türev gx, gyyanı 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 rhohesaplandı . 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_idxI endeksleri çevirmek rho,thetadeğ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).

Yeni sonuç


"maxima'yı orijinal görüntüde edge parametreleri olarak kullanmaya çalıştığımda" Bunu nasıl yapıyorsunuz?
endolith

@Jonas Due Vesterheden Sadece merak bir kez VS doppler frekans görüntü? ...
Spacey

@Mohammad: Bildiğimden değil. Orijinal görüntü bazı devre kartlarındadır. "VS" ile ne demek istiyorsun?
Jonas Due Vesterheden

@JonasDueVesterheden 'VS' sadece 'versus' anlamına gelir. (Zamana karşı doppler frekansı ') :-)
Spacey

Maks. Olmayan baskılama uygulamadan önce hough haritanızı düzeltmelisiniz.

Yanıtlar:


2

Sorunuz biraz karıştı. Hough dönüşümü kenarları değil çizgileri algılamak için kullanılır.

İstediğiniz tek şey bir kenar haritasıysa, degrade büyüklüğünü eşleştirmeli veya Canny kenar dedektörü gibi daha süslü bir şey kullanmalısınız.

Düz çizgileri algılamak istiyorsanız, bir kenar haritasından başlayıp hough, eğer buna erişiminiz varsa, Görüntü İşleme araç kutusu ise işlevi kullanmanız daha iyi olur. Degrade üzerinde bir Hough dönüşümü yapmanın sorunu, düz bir çizgi oluşturan kenar piksellerinin zıt degrade yönlerine sahip olabilmesidir. Örneğin, bir dama tahtası deseni düşünün. İki kare karesi arasındaki bir kenar, üstünde siyah bir kare ve altında beyaz bir kare olup olmadığına bağlı olarak yönü ters çevirir.

Uygulamanıza gelince, sorun Hough matrisinizdeki kutuların çok küçük olmasıdır. Esasen rho boyutundaki kutu boyutu 1'dir ve teta boyutundaki kutu boyutu 2 dereceden azdır. Bu, gradyan yönelimlerinin pratikte nadiren gerçekleşen bir çizgi oluşturmak için çok hassas bir şekilde yanması gerektiği anlamına gelir. Kutuları daha büyük olacak şekilde rho_idx ve theta_idx'i caculate ederseniz, hat dedektörünüz hatalara karşı daha toleranslı hale gelir ve daha iyi çizgiler elde edebilirsiniz.


1

Bunun bir sorun olup olmadığı hakkında hiçbir fikrim yok ama atan () sadece kadran belirsizliği nedeniyle size -90 ila +90 derece açı veriyor. Tam eğim açısını elde etmek için (-180 ile 180 arası) atan2 () öğesini kullanmanız gerekir.


Önerin için teşekkürler! Anladığım kadarıyla, kenarların "yönleri" önemli olmadığı için -90 ila +90 derece arasındaki açıları kullanmak yeterli olmalıdır. Kullanmayı denedim atan2, ancak sorunları düzeltmedi.
Jonas Due Vesterheden
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.