Helfen Sie mit, Hough Transformation zu verstehen


19

Ich versuche, eine Hough-Transformation in MATLAB zum Laufen zu bringen, aber ich habe Probleme. Ich habe eine wirklich schlechte Art, Peaks zu erkennen, die behoben werden müssen, aber vorher muss ich die Hough-Transformation umkehren können, um die Linien wieder richtig zu erstellen. Das ist die Art von Sachen, die ich gerade bekomme:

Bildbeschreibung hier eingeben

sieht aus wie um 90 Grad gedreht, aber ich bin mir nicht sicher warum. Ich bin nicht sicher, ob es mein Hough-Raum ist, der falsch ist, oder ob es die Art ist, wie ich Hough entferne und die Linien zeichne. Könnte auch jemand dazu beitragen, meine Peakerkennung zu verbessern? Die im Code verwendeten Bilder sind hier

%% 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

Verknüpft: Wie kann man ein Hough-transformiertes Bild entfernen?


hast du es geschafft dein problem zu lösen? Ich stehe vor einem ähnlichen Problem. Danke
Erez Posner

Transformation de hough sous matlab für détecter plusieurs Ellipsen

Antworten:


11

Erstens hat Matlab eine eingebaute Hough-Transformation : Das Rad muss nicht neu erfunden werden.

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

Obwohl Ihr Bild nicht unbedingt eine Kantenerkennung erfordert, können Sie die Verarbeitungszeit und die Effektivität des Algorithmus verbessern, indem Sie ihn verwenden. Ihr Dreieck hat fette Bereiche in Weiß und Schwarz. Idealerweise ist das Dreieck 1px dick und markiert die Kanten des Dreiecks. Verwenden Sie Canny Edge Detection

BW = edge(Image,'canny');

Das Ergebnis ist, dass θ im Bereich von Grad liegt, während Ihr Plot (oder ) ist, also subtrahieren Sie Grad ( ).0 < θ < 180 0 < θ < π 90 π / 290<θ<900<θ<1800<θ<π90π/2

Es besteht die Möglichkeit, dass Sie den falschen Peak auswählen, da benachbarte Peaks in der Akkumulatormatrix möglicherweise größer sind. Obwohl es hier viele Algorithmen gibt, habe ich einen gesehen, der in der Vergangenheit in Hough-Transformationen verwendet wurde:

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.

Schauen Sie in HoughLines nach, um die Ergebnisse der Hough-Transformationslinien anzuzeigen:

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

Auswirkungen der Verwendung von Canny Edge Detector

Die Kantenerkennung kann möglicherweise jede Seite des Dreiecks in zwei Linien umwandeln.

Das Ziel der Canny-Edge-Erkennung besteht darin, durch nichtmaximale Unterdrückung maximal dünne / schmale Kanten zu erzeugen

Canny Edge Detection auf den Punkt gebracht (Quelle: Digital Image Processing, 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

danke für die Antwort. Ich mache es von Grund auf neu, um es besser zu verstehen. Bei der Erkennung von scharfen Kanten werden immer noch 2 Dreiecke angezeigt. eine für die innere Kante und eine für die äußere Kante. Ich habe die Theorie aus Wikipedia gelernt, die besagt, dass Theta 0: pi ist. Ich weiß, dass die eingebaute Funktion -pi / 2 verwendet: pi / 2, aber es sollte keinen wirklichen Unterschied geben?
Waspinator

Auf Anhieb sollte die Reichweite keinen Unterschied machen. (Können Sie den Unterschied zwischen einer um 180 Grad gedrehten Linie erkennen?) JEDOCH macht dies einen Unterschied, wenn Sie die Hough-Transformation für Bildkorrekturalgorithmen verwenden. (Es würde den Unterschied zwischen einem Rightside Up und Upsidedown Image bedeuten)
CyberMen

Würde die Kantenerkennung nicht zwei Linien erzeugen, in denen Sie nur eine finden möchten? Etwas, das die Mitte einer dicken Linie findet, wäre besser.
Endolith

@endolith In den ursprünglichen Beitrag wurde ein wenig über die Kantenerkennung gesprochen
CyberMen

"Keine Notwendigkeit, das Rad neu zu erfinden"? Sagen Sie das meinem Lehrer ;-)
Nathan Schwermann

3
    if image(xi, yj) == 1 

muss geändert werden zu

    if image(yj, xi) == 1 

damit die Leinen im Dehough klappen


1

Die Antwort mit den 3 Schleifen ist weniger als optimal und könnte verbessert werden. Hier ist eher eine intuitive Herangehensweise / Sichtweise:

Jedes Paar gültiger Punkte setzt ein eindeutiges a & b von y = ax + b. Eine Linie enthält viele Paare mit demselben a & b-Wert, sodass eine lange Linie als Spitze vorhanden ist. Dies gilt auch für polare r & teta; -Koordinaten.

Anstatt jeden Punkt einzeln zu behandeln, verwenden Sie Punktpaare. Wenn Sie alle (normalerweise spärlichen) Punkte in einer separaten Liste speichern können, ist dies besser, aber kein Muss.

  1. Nimm jedes Paar und berechne sein a & b. (auf diskrete Werte gerundet)
  2. Gehen Sie zu der bestimmten Stelle im Array und fügen Sie 1 hinzu.

Lange Schlange -> viele Paare mit dem gleichen a, b.
Sporadische Punkte -> kleine Zählung in bestimmten Zellen -> eher Unordnung.


Eine andere Sichtweise ist aus Radon- / projektiver Sicht.

  • Eine Linie wird stark zu einer senkrechten "Sammellinie" vorstehen, so dass sie eine hohe Punktzahl aufweist.
  • Wenn der Winkel zwischen der Linie und der "Sammellinie" nicht 90 ° beträgt oder die Sammellinie nicht alle in diese "Sammellinie" projizierten Linienpunkte sammelt, ist die Punktzahl geringer.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.