Calcul Moments D Une Image En C

Calcul moments d’une image en C

Cette page propose un calculateur interactif pour estimer les moments géométriques d’un objet uniforme dans une image, puis un guide expert pour comprendre les formules, l’implémentation en langage C et les bonnes pratiques de performance en vision par ordinateur.

Pour une image binaire, utilisez généralement 1.

Résultats

Renseignez les paramètres puis cliquez sur le bouton pour calculer m00, m10, m01, le centroïde et les moments centraux d’ordre 2.

Guide expert sur le calcul des moments d’une image en C

Le calcul des moments d’une image est une technique centrale en analyse d’image, en vision industrielle, en robotique, en reconnaissance de formes et en traitement documentaire. Lorsqu’un développeur cherche à réaliser un calcul moments d’une image en C, l’objectif est généralement de résumer la distribution spatiale des intensités dans une structure numérique simple, stable et exploitable rapidement. En pratique, les moments permettent d’estimer l’aire d’un objet, son centre de gravité, sa dispersion selon les axes, sa symétrie et, dans certains cas, d’extraire des descripteurs presque invariants à la translation, à l’échelle et à la rotation.

En langage C, les moments d’image sont particulièrement intéressants parce que ce langage offre à la fois des performances élevées, un contrôle fin de la mémoire et une intégration facile dans les systèmes embarqués. Les caméras industrielles, les chaînes de tri, les automates, les cartes ARM et les bibliothèques natives de vision s’appuient encore très souvent sur du C ou du C compatible. Si vous souhaitez écrire votre propre routine sans dépendre d’une grosse bibliothèque externe, comprendre les formules et l’organisation du code est indispensable.

Définition mathématique des moments bruts

Pour une image discrète en niveaux de gris, le moment brut d’ordre p + q s’écrit :

m(p,q) = somme sur x et y de [ x^p * y^q * I(x,y) ]

I(x,y) est l’intensité du pixel situé en coordonnées (x,y). Les moments les plus utilisés au départ sont :

  • m00 : masse totale ou somme des intensités. Dans une image binaire, c’est l’aire en pixels.
  • m10 : premier moment selon l’axe X.
  • m01 : premier moment selon l’axe Y.

À partir de ces trois valeurs, on calcule le centroïde :

xbar = m10 / m00 ybar = m01 / m00

Ce centroïde est l’équivalent du centre de gravité de l’objet. En suivi d’objets, cette donnée suffit parfois à piloter un servo, centrer un marqueur dans l’image ou estimer un déplacement.

Moments centraux et interprétation géométrique

Les moments bruts dépendent directement de la position absolue dans l’image. Si l’objet se déplace, m10 et m01 changent fortement. Pour supprimer cette dépendance à la translation, on utilise les moments centraux :

mu(p,q) = somme sur x et y de [ (x – xbar)^p * (y – ybar)^q * I(x,y) ]

Les plus utiles en pratique pour commencer sont :

  • mu20 : dispersion autour de l’axe vertical, donc étalement en X.
  • mu02 : dispersion autour de l’axe horizontal, donc étalement en Y.
  • mu11 : corrélation croisée entre X et Y, utile pour l’orientation.

Quand mu20 est beaucoup plus grand que mu02, l’objet est davantage étiré horizontalement. Si les deux sont proches, la forme est plus isotrope, comme un disque. Pour une forme orientée, mu11 participe au calcul de l’angle principal, très utilisé dans le recalage ou l’analyse d’objets allongés.

Astuce pratique : en C, utilisez des accumulateurs de type double même si votre image est codée en 8 bits. Sur des résolutions élevées, les sommes deviennent rapidement très grandes, surtout pour les moments d’ordre 2 et plus.

Pourquoi implémenter les moments en C

Le C reste un excellent choix pour plusieurs raisons. D’abord, une boucle double sur les pixels est simple à écrire et très rapide lorsqu’elle est bien optimisée. Ensuite, l’empreinte mémoire reste minimale. Enfin, dans un pipeline embarqué, vous pouvez coupler directement la lecture du capteur, le seuillage, l’étiquetage et le calcul des moments sans copies inutiles. Cette approche est fréquente dans les applications temps réel où chaque milliseconde compte.

  1. Lecture de l’image en mémoire.
  2. Conversion éventuelle en niveaux de gris.
  3. Seuillage ou segmentation.
  4. Accumulation des moments.
  5. Calcul du centroïde et des descripteurs dérivés.
  6. Décision métier : tri, alarme, positionnement, suivi.

Implémentation de base en C

Le principe d’implémentation est direct : on parcourt chaque pixel, on lit son intensité, puis on ajoute sa contribution aux sommes. Pour une image binaire, la contribution vaut 0 ou 1. Pour une image en niveaux de gris, la contribution vaut la valeur du pixel. Voici l’idée générale :

double m00 = 0.0, m10 = 0.0, m01 = 0.0; double mu20 = 0.0, mu02 = 0.0, mu11 = 0.0; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { double v = image[y * width + x]; m00 += v; m10 += x * v; m01 += y * v; } } double xbar = m10 / m00; double ybar = m01 / m00; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { double v = image[y * width + x]; double dx = x – xbar; double dy = y – ybar; mu20 += dx * dx * v; mu02 += dy * dy * v; mu11 += dx * dy * v; } }

Cette approche en deux passes est claire et robuste. Une première passe produit les moments bruts et le centroïde. Une seconde calcule les moments centraux. Il existe des variantes plus avancées pour réduire le nombre d’accès mémoire ou vectoriser les opérations, mais pour la majorité des projets, cette version est idéale comme base de départ.

Résolutions courantes et impact mémoire

Avant même de parler d’optimisation, il faut mesurer la volumétrie. Les statistiques suivantes concernent une image en niveaux de gris sur 8 bits, soit 1 octet par pixel. Elles montrent à quel point la taille mémoire augmente vite avec la résolution.

Résolution Pixels Mémoire 8 bits Usage typique
640 x 480 307 200 300 Kio environ Vision embarquée légère, anciens capteurs
1280 x 720 921 600 900 Kio environ Vidéo HD, inspection standard
1920 x 1080 2 073 600 1,98 Mio environ Caméras industrielles et traitement temps réel
3840 x 2160 8 294 400 7,91 Mio environ Inspection fine, acquisition 4K

Ces chiffres sont importants, car le coût des moments d’image est linéaire en nombre de pixels. Plus l’image est grande, plus le nombre d’opérations grimpe. Même si le calcul reste conceptuellement simple, une mauvaise implémentation peut devenir pénalisante à 60 images par seconde.

Charge de calcul estimée à 60 images par seconde

Le tableau suivant donne un ordre de grandeur pour une routine de moments bruts m00, m10 et m01. On considère environ 5 opérations arithmétiques par pixel, sans compter les accès mémoire et la segmentation préalable.

Résolution Pixels par image Pixels par seconde à 60 i/s Opérations arithmétiques estimées par seconde
640 x 480 307 200 18 432 000 92 160 000
1280 x 720 921 600 55 296 000 276 480 000
1920 x 1080 2 073 600 124 416 000 622 080 000
3840 x 2160 8 294 400 497 664 000 2 488 320 000

Ces statistiques montrent pourquoi le C reste si pertinent. À partir de la Full HD ou de la 4K, le moindre surcoût algorithmique se voit immédiatement. C’est aussi la raison pour laquelle on travaille souvent sur des régions d’intérêt, sur des images binaires déjà segmentées, ou avec des optimisations SIMD quand cela est justifié.

Différence entre image binaire et image en niveaux de gris

Dans une image binaire, chaque pixel appartient soit au fond, soit à l’objet. Le moment m00 représente alors directement le nombre de pixels de l’objet. C’est très pratique pour la métrologie élémentaire. En niveaux de gris, les intensités pondèrent le calcul. Deux objets de même taille mais de contraste différent n’auront pas nécessairement le même m00. Il faut donc toujours décider si l’on cherche une géométrie pure, obtenue après seuillage, ou une mesure pondérée par l’intensité.

  • Binaire : robuste pour aire, centroïde, orientation d’une région segmentée.
  • Niveaux de gris : utile pour blobs lumineux, taches laser, fluorescence, suivi photométrique.

Moments normalisés et invariants

Quand on veut comparer des objets de tailles différentes, on normalise souvent les moments centraux. Une écriture classique consiste à diviser par une puissance de m00. On obtient alors des moments moins sensibles à l’échelle. En allant plus loin, les invariants de Hu combinent certains moments normalisés pour construire des descripteurs presque invariants à la rotation, à la translation et au changement d’échelle. Pour des tâches simples, m00, le centroïde et les moments d’ordre 2 suffisent. Pour la reconnaissance de formes plus avancée, les invariants deviennent précieux.

Erreurs fréquentes en programmation C

  • Utiliser int à la place de double pour les sommes.
  • Oublier de tester m00 == 0 avant de diviser.
  • Mélanger les conventions de coordonnées entre bibliothèque image et algorithme.
  • Confondre indice ligne colonne et coordonnées x y.
  • Calculer des puissances avec pow() dans la boucle interne, ce qui ralentit inutilement le code.

Une bonne pratique consiste à pré-calculer les expressions simples. Par exemple, au lieu d’appeler pow(x,2), utilisez directement x * x. Sur des millions de pixels, le gain est significatif.

Cas d’usage industriels concrets

En inspection visuelle, les moments servent à vérifier qu’une pièce est bien centrée dans son logement. En agriculture de précision, ils aident à localiser des fruits ou des zones foliaires sur des images segmentées. En microscopie, ils permettent de mesurer la position et la compacité de cellules ou de particules. En robotique mobile, ils aident au suivi de ligne ou au recentrage sur une cible colorée après seuillage. Dans chacun de ces scénarios, l’algorithme doit être fiable, lisible et suffisamment rapide pour fonctionner en continu.

Comment interpréter le calculateur de cette page

Le calculateur ci-dessus n’intègre pas une image pixel par pixel. Il fournit une estimation analytique des moments pour des objets uniformes idéalisés, comme un rectangle, un disque ou une ellipse. Cette approche est très utile pour valider vos formules, vérifier la cohérence de votre code C et comprendre le rôle des paramètres géométriques. Par exemple, si vous doublez la largeur d’un rectangle tout en conservant son centre, m00 double, tandis que mu20 augmente encore plus vite parce qu’il dépend de la dispersion quadratique selon X.

Ressources de référence

Pour approfondir la vision par ordinateur, la mesure d’objets et l’analyse d’image, vous pouvez consulter plusieurs sources académiques et institutionnelles reconnues :

Conclusion

Maîtriser le calcul moments d’une image en C revient à posséder un outil simple mais extrêmement puissant. Avec quelques accumulateurs et des formules bien comprises, vous pouvez extraire l’aire d’un objet, son centre, son orientation et une bonne partie de sa signature géométrique. Le C vous permet d’implémenter tout cela avec une excellente efficacité, que ce soit sur une station de travail, un système embarqué ou une chaîne industrielle. Commencez par les moments bruts et centraux d’ordre 2, sécurisez vos types numériques, validez sur des formes simples comme celles du calculateur, puis faites évoluer votre code vers des moments normalisés et des invariants si votre projet l’exige.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top