2010-08-02 14 views
2

Bon, je cherche quelque chose qui s'apparente à des images intégrales (sommation de tables de surfaces) utilisées dans l'accélération de calculs intégraux sur une fenêtre. J'ai une image I et son image gradient G. Je veux calculer l'intégrale de droite à partir de deux points arbitraires a et b dans l'image de la valeur absolue de G. Évidemment, je peux franchir la ligne (1- t) a + t * b, t dans [0, 1] et récapitulatif en fonction de la taille du pas t correct. Je veux, cependant, faire cela plusieurs millions de fois donc je voudrais une structure d'accélération qui de préférence ne nécessite pas de faire une boucle pour chaque paire (a, b).Algorithme rapide pour des intégrales de plusieurs lignes sur une fonction discrète 2D

Est-ce que quelqu'un connaît un algorithme existant pour accomplir ce genre de chose?

Répondre

0

Je pense que la réponse est non. Si vous intégrez le gradient et non sa valeur absolue, ce serait trivial.

J'aurais cependant une autre préoccupation: Comment interpolez-vous sur G? Vous aurez des valeurs de pixels, et les points d'échantillonnage que vous utiliserez pour calculer l'intégrale ne tomberont généralement pas exactement sur les pixels. Soit "choisir la valeur de pixel la plus proche" ou "interpoler entre les quatre voisins" fera l'affaire. Ce dernier est plus précis, le premier est plus rapide.

Depuis | G | est susceptible de ne pas être lisse, vous n'aurez pas d'autre choix que la règle trapézoïdale (coûteuse) pour l'intégration.

EDIT: Voir Bresenham's algorithm. Puisque vous ne serez pas interpolé, cela devrait fournir une optimisation utile.

+0

Oui, c'est ce dont j'avais peur. Merci Alexandre, je vais le laisser sans réponse pendant un jour ou deux au cas où quelqu'un connaîtrait une technique algorithmique folle. Quant à votre question sur l'interpolation sur G, cela n'a pas besoin d'être un calcul très précis, donc je prévois juste de pixelliser la ligne entre les points et de sommer les valeurs de tous les pixels de la ligne. – jcb

+0

@quadelirius: voir mon edit puisque vous n'interpolerez pas. –

+0

La règle trapézoïdale ne doit pas être chère. Voir mon article pour une bonne optimisation. – riwalk

1

Vous semblez connaître vos maths, je vais donc suggérer l'algorithme adaptive quadrature.

Il est le plus souvent utilisé pour calculer efficacement des intégrales 2D simples, mais vous pouvez probablement l'utiliser à bon escient pour ce sur quoi vous travaillez.