Hough dönüşümünün anlaşılmasına yardımcı olun


19

MATLAB'da çalışmak için bir Hough dönüşümü elde etmeye çalışıyorum, ancak sorun yaşıyorum. Düzeltilmesi gereken zirveleri tespit etmek için gerçekten kötü bir yolum var, ancak bundan önce hatları tekrar düzgün bir şekilde oluşturmak için hough dönüşümünü tersine çevirebilmem gerekiyor. Şu an elde ettiğim şey bu:

resim açıklamasını buraya girin

90 derece döndürülmüş gibi görünüyor, ama neden olduğundan emin değilim. Bu benim Hough alanımın yanlış olup olmadığından emin değilim veya Hough'u defetip çizgileri çizmemden emin değilim. Ayrıca birisi tepe algılamamı geliştirmeye yardımcı olabilir mi? Kodda kullanılan resimler burada

%% load a sample image; convert to grayscale; convert to binary

%create 'x' image (works well)
a = eye(255);
b = flipud(eye(255));
x = a + b;
x(128,128) = 1;

%image = rgb2gray(imread('up.png')) < 255;
%image = rgb2gray(imread('hexagon.png')) < 255;
%image = rgb2gray(imread('traingle.png')) < 255;
%%% these work
%image = x;
%image = a;
image = b;    

%% set up variables for hough transform
theta_sample_frequency = 0.01;                                             
[x, y] = size(image);
rho_limit = norm([x y]);                                                
rho = (-rho_limit:1:rho_limit);
theta = (0:theta_sample_frequency:pi);
num_thetas = numel(theta);
num_rhos = numel(rho);
hough_space = zeros(num_rhos, num_thetas);

%% perform hough transform
for xi = 1:x
    for yj = 1:y
        if image(xi, yj) == 1 
            for theta_index = 1:num_thetas
                th = theta(theta_index);
                r  = xi * cos(th) + yj * sin(th);
                rho_index = round(r + num_rhos/2);                      
                hough_space(rho_index, theta_index) = ...
                     hough_space(rho_index, theta_index) + 1;
            end
        end
    end
end  

%% show hough transform
subplot(1,2,1);
imagesc(theta, rho, hough_space);
title('Hough Transform');
xlabel('Theta (radians)');
ylabel('Rho (pixels)');
colormap('gray');

%% detect peaks in hough transform
r = [];
c = [];
[max_in_col, row_number] = max(hough_space);
[rows, cols] = size(image);
difference = 25;
thresh = max(max(hough_space)) - difference;
for i = 1:size(max_in_col, 2)
   if max_in_col(i) > thresh
       c(end + 1) = i;
       r(end + 1) = row_number(i);
   end
end

%% plot all the detected peaks on hough transform image
hold on;
plot(theta(c), rho(r),'rx');
hold off;


%% plot the detected line superimposed on the original image
subplot(1,2,2)
imagesc(image);
colormap(gray);
hold on;

for i = 1:size(c,2)
    th = theta(c(i));
    rh = rho(r(i));
    m = -(cos(th)/sin(th));
    b = rh/sin(th);
    x = 1:cols;
    plot(x, m*x+b);
    hold on;
end

Bağlantılı: Bir Hough'un De-Houghing dönüşümü nasıl yapılır?


sorununuzu çözmeyi başardınız mı? benzer bir sorunla karşı karşıyayım. teşekkürler
Erez Posner

dönüşüm de hough sous matlab dökün détecter plusieurs elipsler

Yanıtlar:


11

İlk olarak, Matlab'ın Dahili Hough Dönüşümü vardır : tekerleği yeniden icat etmeye gerek yok.

[H,T,R] = hough(BW,'RhoResolution',0.5,'Theta',-90:0.5:89.5);

Resminizin kenar tespiti gerektirmesi gerekmese de, kullandığım algoritmanın işlem süresini ve etkinliğini artırabilirsiniz. Üçgeninizin beyaz ve siyah yağ bölgeleri vardır. İdeal olarak, üçgen üçgenin kenarlarını işaretleyerek 1 piksel kalınlığında olacaktır. Canny Edge Detection Kullan

BW = edge(Image,'canny');

-90<θ<900<θ<1800<θ<π90π/2

Akümülatör matrisinde daha büyük olabilecek komşu pikler olduğu için yanlış zirveyi seçmeniz için bir potansiyel vardır. Burada birçok algoritma olsa da, geçmişte Hough Transforms'da kullanıldığını gördüğüm bir algoritma var:

1) Define a region shape (typically its square) 
2) Define an accumulator threshold  
3) Select one pixel in the accumulator matrix
4) If it is a peak (i.e., larger than neighboring values above a threshold)
       a) look at the points within the region shape.
       b) If there is a larger value
              this is not a peak
          Else
              this is a peak
 5) Move to next pixel in accumulator matrix.

Hough dönüşüm hatlarını görüntülemek için HoughLines'e bakın, sonuçlar:

http://www.mathworks.com/help/toolbox/images/ref/houghlines.html

Canny Edge Detector Kullanmanın Etkileri

Kenar Algılama, üçgenin her iki tarafını da potansiyel olarak iki satıra dönüştürebilir.

Canny kenar algılamanın amacı, maksimal olmayan baskı kullanarak maksimum ince / dar kenarlar üretmektir.

Kısaca Canny Edge Algılama (Kaynak: Dijital Görüntü İşleme, Gonazalez)

1) Smooth input Image using a Gaussian Filter
2) Compute the Gradient magnitude and angle (Sobel, Perwitt or robert cross filters)
3) Apply Nonmaxima suppression (this is where the thinning happens) 
   a) Figure out which direction the edge is
   b) If the edge's magnitude is smaller than one of its two neighbors in the direction of the edge
          set the edge point to zero
      Else
          leave it alone
4) Use double thresholding and connectivity analysis to detect and link edges

Cevap için teşekkürler. Daha iyi anlamak için bunu sıfırdan yapıyorum. canny edge algılama hala 2 üçgen veriyor. biri iç kenar için ve dış kenar için dışarı. Teoriyi teta'nın 0: pi olduğunu belirten wikipedia'dan öğrendim. Yerleşik işlevin -pi / 2: pi / 2 kullandığını biliyorum, ancak gerçek bir fark olmamalı mı?
waspinator

Yarasadan hemen sonra, aralık bir fark yaratmamalıdır. (180 derece döndürülmüş bir çizgi arasındaki farkı söyleyebilir misiniz?) ANCAK, görüntü düzeltme algoritmaları için hough dönüşümünü kullanıyorsanız bu bir fark yaratır. (Bu, yukarı doğru ve yukarı doğru bir görüntü arasındaki fark anlamına gelir)
CyberMen

Kenar algılama, yalnızca 1'i bulmak istediğiniz yerde 2 satır üretmez mi? Kalın bir çizginin merkezini bulan bir şey daha iyi olurdu.
endolith

@ endolith Orijinal yazıda kenar algılama üzerine biraz tartışma
eklendi

'tekerleği yeniden icat etmeye gerek yok'? Bunu
hocamıza

3
    if image(xi, yj) == 1 

olarak değiştirilmesi gerekiyor

    if image(yj, xi) == 1 

hatların çalışmasına rağmen


1

3 döngüyü kullanan cevap optimalden daha azdır ve geliştirilebilir, işte sezgisel bir yaklaşım / bakış açısı:

Geçerli noktaların her çifti benzersiz bir & b ayarlar y = ax + b. Bir çizgi aynı a & b değerine sahip birçok çift içerecektir, bu nedenle uzun bir çizgi tepe noktası olarak mevcut olacaktır. Bu, polar r & teta koordinatları için de geçerlidir.

Her noktayı ayrı ayrı işlemek yerine nokta çiftleri kullanın. Tüm (genellikle seyrek) noktaları ayrı bir listede saklayabiliyorsanız, daha iyi, ancak bu bir zorunluluk değildir.

  1. Her çifti alın ve a & b değerini hesaplayın. (ayrık değerlere yuvarlanır)
  2. Dizideki belirli bir yere gidin ve 1 ekleyin.

Uzun çizgi -> a ile aynı çiftler a, b.
Sporadik noktalar -> belirli hücrelerde küçük sayım -> daha çok dağınıklık gibi.


Ona bakmanın bir başka yolu da bir Radon / projektif bakış açısıdır.

  • Bir çizgi, yüksek puanı olan dikey bir "toplama hattına" kuvvetli bir şekilde yansıyacaktır.
  • Hat ile "toplama hattı" arasındaki açı 90 derece değilse veya toplama hattı bu "toplama hattına" yansıtılan tüm hat noktalarını toplamıyorsa, daha düşük puan olacaktır.
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.