2015-08-14 2 views
1

J'utilise l'opérateur sobel pour détecter les bords dans une image en niveaux de gris avec EmguCV 3.0 (le Wrapper .NET pour OpenCV).OpenCV: Sobel filtre pas invariant de rotation

Le code J'utilise est

Image<Gray, byte> gray = new Image<Gray, byte>(@"C:\gray.bmp"); 
Image<Gray, float> sobel = gray.Sobel(0, 1, 3).Add(gray.Sobel(1, 0, 3)).AbsDiff(new Gray(0.0)); 

Ceci est l'image prétraitée (gris)

Et ce que je sors (Sobel)

Comme vous pouvez le voir, les bords en haut à droite et en bas à gauche sont très faibles. J'ai d'abord pensé que cela pouvait avoir quelque chose à voir avec l'image originale, alors je l'ai fait pivoter de 180 degrés et j'ai refait le filtre sobel. Le résultat a toujours des bords très faibles en haut à droite et en bas à gauche (malheureusement, je ne suis pas autorisé à poster plus de deux liens ici, donc je ne peux pas vous le montrer).

Alors Ma question est: Est-ce un bug, ou est-ce que j'utilise le filtre Sobel? Ne devrait-il pas être invariant en rotation, lorsqu'il est exécuté en deux dimensions? Et comment puis-je le réparer, pour voir ces deux bords aussi forts que les autres?

+0

L'opérateur sobel, appliqué à l'image pivotée: http://i.stack.imgur.com/U7QCF.jpg (encore faible bords en haut à droite et en bas à gauche) – derjan

+0

Pourquoi ne pas créer votre propre filtre? http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/filter_2d/filter_2d.html – William

Répondre

1

Je suis désolé, j'ai déjà trouvé une solution: Le code que j'utilise maintenant est:

Image<Gray, float> sobel = 
    gray.Sobel(1, 0, 3).AbsDiff(new Gray(0.0)) 
     .Add(gray.Sobel(0, 1, 3).AbsDiff(new Gray(0.0))); 

Cette norme se rapproche de la par | Gxy | = | Gx | + | Gy |, et le résultat est une bonne image avec de beaux bords propres: http://i.stack.imgur.com/COJSG.png