2009-09-08 11 views
4

Je cherche un peu de clarification sur la façon dont les algorithmes mis en œuvre dans la détection de bord Canny - Wikipedia entry - travail. Il semble assez simple d'effectuer une réduction de bruit en utilisant un filtre Gaussien 2D, mais j'ai entendu dire que l'utilisation de deux filtres 1D - comment cela est-il accompli? Il est également simple de calculer le gradient et la direction du bord. Cependant, lorsque vous effectuez une suppression non maximale, y a-t-il une astuce pour obtenir l'angle arrondi? Ce que je suis en train de faire est de diviser la valeur de la direction du front (thêta) par pi/4, en le transformant en entier et en utilisant une instruction switch. Mais, comment gérer les valeurs thêta négatives - c'est-à-dire que -pi/4 devrait être traité de la même manière que 3 * pi/4 ou le même que pi/4?Canny Edge Detector en C

Tous les conseils/liens sont très appréciés!

Merci, Ben

Répondre

7

distribution gaussienne:

[constantes sont omis pour simplifier]

G2D (x, y) = exp (-x xy y) = exp (-x^2) * exp (-y^2) = g1d (x) * g1d (y)

Ainsi peut être séparé en multiplication de distributions 1d. Et ainsi la filtration peut être réalisée d'abord dans la direction x (indépendamment sur chaque ligne), puis dans la direction y (indépendamment sur chaque colonne)

angle arrondi:

Si l'angle est à l'extérieur de [0. .pi) il est correct dans ce cas d'ajouter/soustraire pi autant de fois que nécessaire (ou utiliser la fonction fmod), et pour [0..pi) tout est clair. En fonction de la plate-forme, il vaut peut-être mieux éviter l'utilisation d'arctan: vous pouvez tracer un cercle, le diviser en 4 zones et créer un ensemble de conditions pour les composants de gradient qui utilisent uniquement des opérations arithmétiques et vous donner une réponse la direction de la zone est.

1

Avez-vous besoin de l'implémenter vous-même ou pouvez-vous utiliser une bibliothèque? OpenCv est une énorme bibliothèque C d'algorithmes en vision par ordinateur incluant la détection des contours: http://opencv.willowgarage.com/documentation/image_processing.html?highlight=canny#cvCanny.

Si vous le faites à des fins éducatives, je suggère d'envisager l'achat d'un bon texte sur la vision par ordinateur. Presque n'importe quel texte d'introduction discutera de filtrage avec le gaussien (et le tour 1d bien documenté) aussi bien que la détection de bord canny et la suppression non maximum.

1

Je pense que -pi/4 devrait être traité de la même manière que 3 * pi/4, car les deux définissent la même diagonale.

Si vous pouvez normaliser l'angle du gradient de sorte qu'il se trouve dans [0, pi), alors vous pouvez utiliser une fonction simple comme suit pour quantifier l'angle:

enum Angle 
{ 
    HORIZONTAL, 
    DIAG_UP, 
    VERTICAL, 
    DIAG_DOWN 
}; 

Angle quantizeAngle(double theta) 
{ 
    if (0 <= theta && theta < PI/8.0) || (7.0*PI/8.0 <= theta && theta < PI)) 
     return HORIZONTAL; 
    else if (PI/8.0 <= theta && theta < 3.0*PI/8.0) 
     return DIAG_UP; 
    else if (3.0*PI/8.0 <= theta && theta < 5.0*PI/8.0) 
     return VERTICAL; 
    else 
     return DIAG_DOWN; 
}