2016-12-07 2 views
2

Ich möchte Kanten mit Canny-Methode erkennen. Am Ende möchte ich zwei Kantenkarten: 1 für die horizontale 1 für die vertikale Richtung.Orientierende Canny Edge Detection

In MATLAB kann dies durch die Verwendung von Sobel oder Prewitt-Operatoren mit einem zusätzlichen direction-Argument erreicht werden, aber für Canny haben wir diese Option nicht.

E = edge(I,'Sobel','horizontal') 

Haben Sie eine Idee, wie Sie horizontale und vertikale Kanten separat mit Canny extrahieren?

+0

Sie sollten zuerst lesen, wie ein Canny-Kanten Algorithmus arbeiten ... A Canny-Algorithmus IS Richtungsunempfindlicher, es keinen Sinn machen, horizontale oder vertikale Kanten zu extrahieren. – obchardon

+0

[wie funktioniert eine schlaue Kantenerkennung] (http://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.html#steps) – obchardon

+0

@obchardon von dem Link, den Sie angegeben: "Die Richtung ist auf einen von vier möglichen Winkeln gerundet (nämlich 0, 45, 90 oder 135). "Also nehme ich an, dass diese für vertikal, horizontal, diagonal-links, diagonal-rechts sind. Ich bin nur an vertikalen und horizontalen interessiert. –

Antwort

2

Es gibt keine Möglichkeit, die eingebaute edge Funktion zu verwenden. Canny Kantendetektion verwendet jedoch die Winkel aus der Sobel Operator. Es ist sehr einfach, diese Werte zu reproduzieren.

  1. Beginnen Sie mit einem Bild, ich verwende ein eingebautes Demobild.

    A = im2double(rgb2gray(imread('peppers.png'))); 
    
  2. Holen Sie sich das Canny

    A_canny = edge(A, 'Canny'); 
    
  3. Sobel Operator Kanten - Wir können nicht die eingebaute Implementierung verwenden (edge(A_filter, 'Sobel')), weil wir die Kantenwinkel wollen, nicht nur die Randpositionen, also implementieren wir unseren eigenen Betreiber.

    a. Gauß-Filter Dies ist ein Vorverarbeitungsschritt für Canny, also sollten wir es wahrscheinlich hier reproduzieren

    A_filter = imgaussfilt(A); 
    

    b. Faltung zum Finden orientierter Gradienten

    %These filters measure the difference in values between vertically or horizontally adjacent pixels. 
    %Effectively, this finds vertical and horizontal gradients. 
    vertical_filter = [-1 0 1; -2 0 2; -1 0 1]; 
    horizontal_filter = [-1 -2 -1; 0 0 0; 1 2 1]; 
    A_vertical = conv2(A_filter, vertical_filter, 'same'); 
    A_horizontal = conv2(A_filter, horizontal_filter, 'same'); 
    

    c. Berechnen Sie die Winkel

    A_angle = arctan(A_vertical./A_horizontal); 
    
  4. Holen Sie sich die Winkelwerte an den Randstellen

    A_canny_angles = nan(size(A)); 
    A_canny_angles(A_canny) = A_angle(A_canny); 
    
  5. die Winkel wählen, die Sie interessiert sind, in

    angle_tolerance = 22.5/180*pi; 
    target_angle = 0; 
    A_target_angle = A_canny_angles >= target_angle*pi/180 - angle_tolerance & ... 
        A_canny_angles<= target_angle*pi/180 + angle_tolerance; 
    

Also, wenn ich bin Nach horizontalen Linien suchend, wäre mein Zielwinkel Null. Das Bild unten zeigt die Schritte 1, 2, 4 und 5. Das Endergebnis der extrahierten horizontalen Linien wird unten rechts angezeigt. Sie können sehen, dass sie nicht genau horizontal sind, weil ich ein so großes Winkeltoleranzfenster verwendet habe. Dies ist ein einstellbarer Parameter, der davon abhängt, wie genau Sie den Zielwinkel treffen möchten.

Result

+0

das sieht gut genug für mich aus. Vielen Dank! –