Question

J'écris mon propre filtre gaussienne mais il est vraiment lent.

algorithme gaussien de OpenCV est beaucoup plus rapide, 20 fois que mon filtre gaussienne. Je veux réécrire l'algorithme gaussien de OpenCV dans mon projet, et je ne veux pas inclure OpenCV dans mon projet.

Cependant,

  

Quelqu'un peut-il me donner la description de l'algorithme, le code source de OpenCV   semble trop difficile à comprendre?

Était-ce utile?

La solution

Le filtre gaussien a une propriété qui le rend très facile à accélérer: le filtre peut être appliqué dans les deux dimensions de manière indépendante. Vous définir un filtre à une dimension fonctionnant verticalement, et une autre qui fonctionne à l'horizontale, et de les appliquer à la fois; ce qui produit le même effet qu'un seul filtre appliqué en deux dimensions.

Au-delà de cela, vous aurez probablement besoin de regarder les instructions SIMD par exemple SSE3 disponible pour votre processeur.

Autres conseils

Pour répondre à la deuxième partie de votre question, un flou gaussien est simplement une surface gaussienne 3-d appliquée en tant que noyau de convolution sur l'image. Wikipedia a une grande référence sur l'algorithme lui-même, mais au fond, vous prenez les valeurs d'une gaussienne la courbe et la convertir en une matrice carrée, et multiplier par chaque pixel dans l'image, par exemple:

Kernel:               
[0 1 2 0 0
1 4 6 4 1      X   Iterate over every single pixel in the image
2 6 10 6 2
1 4 6 4 1
0 1 2 1 0]

(Notez que ceci est juste un noyau de l'échantillon, il y a des eqns très spécifiques qui, en fonction de vos gaussiennes, vous obtiendrez des résultats différents)

Pour répondre à la partie de la performance de votre question, la vitesse globale de cet algorithme dépend de quelques choses, en supposant une image de taille constante. Disons que l'image est pixels NxM, et le noyau de convolution est pixels PxP. Vous allez devoir faire P P opérations N * M. Plus P, vous plus les opérations vont devoir faire pour une image donnée. Vous pouvez obtenir rusée avec l'algorithme que vous utilisez ici, faire la ligne très spécifique ou mathématiques sur colonnaire.

La mise en œuvre est également très important. Si vous voulez être extrêmement efficace, vous aurez probablement envie d'utiliser les instructions les plus avancées que votre architecture offre. Si vous utilisez une puce Intel x86, vous aurez probablement envie de chercher à obtenir une licence pour les primitives de performance Intel (IPP) et d'appeler ces instructions directement. IIRC, OpenCV fait utiliser IPP quand elle est disponible ...

Vous pouvez aussi faire quelque chose de très intelligent et travailler avec tous les entiers mis à l'échelle si la performance en virgule flottante sur votre architecture donnée est pauvre. Ce serait sans doute accélérer les choses un peu, mais j'envisager d'autres options avant d'aller dans cette voie.

Essayez de vérifier . Vous voulez comprendre la matrice gaussienne discrète à l'avance, convoluer ensuite avec l'image.

Si votre noyau de convolution est relativement grand et vous implémentez convolution directe, la différence de performance peut être parce que OpenCV met en œuvre convolution en utilisant une transformation de Fourier rapide (FFT).

Je déteste être pédant, mais vous demandez un algorithme, qui est une séquence précise des étapes nécessaires pour accomplir une tâche. Vous avez déjà l'algorithme gaussienne. Donc, le point clé de votre question est quand vous demandez quelque chose plus rapide , ce qui est la même chose que demander un algorithme.

Pour répondre à la plus rapide question - vous voulez savoir comment OpenCV optimise son code, ce qui est un sujet très technique et large. Je hasarder une hypothèse en disant qu'il utilise le langage d'assemblage, et des fonctions spécifiques au GPU. Je commencerai par l'assemblage d'apprentissage et des recherches sur l'ensemble CUDA pour profiter de votre GPU.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top