# Gnral Dveloppement > Algorithme & Mathmatiques > Traitement d'images >  Initialisation algorithme K-means

## betsprite

Bonsoir,

J'aimerais utiliser l'algorithme des k-means pour segmenter une image. Pour le mettre en place, je pense d'abord choisir une image en niveau de gris. Les classes reprsenteraient donc un certain niveau de gris j'imagine et les objets seraient rattachs  ces classes en fonction de leur "cart" d'intensit.

Seulement, je ne sais pas comment se passe l'initialisation pour mes classes. Ce choix doit tre fait manuellement  partir de l'histogramme de l'image ? Autrement dit, pour chaque image, l'utilisateur doit regarder d'abord l'histogramme et en dduire les valeurs initiales des diffrents centroides ?

Cette faon de procder tant assez lourde, existe-t-il une meilleur solution ?

Je vous remercie  :;):

----------


## pseudocode

Pour un image en niveau de gris on n'a qu'un histogramme 1D (une dimension). Le partager en N rgions gales n'est pas tres compliqu  faire analytiquement, et ne requiert pas d'utiliser les k-means.

Mais pour rpondre  ta question, oui, l'algo de k-means requiert une position initiale des centroides. Il existe beaucoup d'heuristiques pour choisir ces centroides initiaux, depuis le simple 'random' jusqu'a la recherche de 'modes'.

----------


## betsprite

Merci pseudocode pour ta rponse  :;): 




> Le partager en N rgions gales n'est pas tres compliqu  faire analytiquement


Par analytiquement, tu veux dire que l'utilisateur doit, une fois l'image  segmenter choisie, choisir les centres sur l'histogramme (donc manuellement)?




> jusqu'a la recherche de 'modes'


En fait, je rechercherais une mthode pouvant tre automatis. Est-ce possible, sans avoir de connaissance au pralable sur l'image  segmenter, d'initialiser assez "justement" les centres ?

Merci  :;):

----------


## pseudocode

> Merci pseudocode pour ta rponse 
> 
> Par analytiquement, tu veux dire que l'utilisateur doit, une fois l'image  segmenter choisie, choisir les centres sur l'histogramme (donc manuellement)?


Non, je voulais dire que dans le cas des niveaux de gris, on peut mathmatiquement dcouper l'histogramme de telle sorte d'avoir N classes de mme taille (en pixels), ou N classes visuellement distinctes (en luminosit), etc.




> En fait, je rechercherais une mthode pouvant tre automatis. Est-ce possible, sans avoir de connaissance au pralable sur l'image  segmenter, d'initialiser assez "justement" les centres ?


Dj, je n'ai pas compris si tu cherches uniquement a segmenter les "intensits" de l'image (= rduire le nombre de couleur) ou si tu cherches a segmenter les pixels de l'image (= dcouper en zones).

----------


## betsprite

Bonjour,




> Dj, je n'ai pas compris si tu cherches uniquement a segmenter les "intensits" de l'image (= rduire le nombre de couleur) ou si tu cherches a segmenter les pixels de l'image (= dcouper en zones).


En fait, je cherche  attribuer  chaque pixel de mon image une classe pour que mon image soit segmente (pour une image binaire, obtenir le fond et l'objet sparment). Je me suis dis que commencer par une image en niveau de gris serait un bon moyen de comprendre simplement l'algorithme mme si il est vident qu'entre par exemple une image en niveau de gris et une image couleur, l'initialisation des centres et le critre d'appartenance  une classe ne sont pas les mmes.




> Non, je voulais dire que dans le cas des niveaux de gris, on peut mathmatiquement dcouper l'histogramme de telle sorte d'avoir N classes de mme taille (en pixels), ou N classes visuellement distinctes (en luminosit), etc.


Ok mais si je dcoupe mon histogramme automatiquement en N classes de mme taille, il y a trs peu de chance pour que les centres soient placs de faon optimale (transition entre deux rgions). Dans ce cas, cela reviendrait  choisir les centres avec un random non ?

Merci encore  :;):

----------


## pseudocode

> Bonjour,
> 
> En fait, je cherche  attribuer  chaque pixel de mon image une classe pour que mon image soit segmente (pour une image binaire, obtenir le fond et l'objet sparment). Je me suis dis que commencer par une image en niveau de gris serait un bon moyen de comprendre simplement l'algorithme mme si il est vident qu'entre par exemple une image en niveau de gris et une image couleur, l'initialisation des centres et le critre d'appartenance  une classe ne sont pas les mmes.


C'est donc bien une segmentation spatiale. Je retire donc ma remarque sur la possibilit d'une solution analytique.

Donc, le problme est de trouver o placer les N centroids initiaux des classes. Une mthode usuelle est de choisir le centre des N zones les plus homognes. Par exemple, on peut procder par dichotomie en coupant une zone en 4 si elle n'est pas homogne (= si la variance suprieur  un seuil).

----------


## betsprite

> on peut procder par dichotomie en coupant une zone en 4 si elle n'est pas homogne (= si la variance suprieur  un seuil).


Ceci reviendrait  faire une sorte de segmentation par "split" ou division par dichotomie tout en retenant la teneur en niveau de gris de chacune des rgions non ?

Ce serait pas trop lourd pour une initialisation ?

Aussi, une autre question qui me vient concernant l'algorithme des k-means :

En fait, toutes les mthodes de classification comme les PCM, FCM, ..., ont un algorithme itratif du mme genre que les k-means sauf que la recherche des centroides et la rpartition des pixels parmi les centroides se font diffremment c'est a ? (en gros c'est des techniques un peu plus pointues pour de meilleurs rsultats non?)

----------


## pseudocode

> Ceci reviendrait  faire une sorte de segmentation par "split" ou division par dichotomie tout en retenant la teneur en niveau de gris de chacune des rgions non ?


Oui. Soit des "split" successifs (partager une zone en 4 blocs), soit au contraire des "merge" successifs (crer une zone en runissant 4 blocs).




> Ce serait pas trop lourd pour une initialisation ?


Pour la mthode "split" il suffit d'arrter lorsqu'on a partag les N plus grandes zones, ce qui limite le nombre d'tapes. Mais ca implique de devoir calculer les variances sur de trs grandes zones (par exemple avec une "sum image").

Pour le merge, on calcule incrmentalement les variances. Mais il faut faire toutes les tapes du merge pour connaitre les N plus grandes zones.




> Aussi, une autre question qui me vient concernant l'algorithme des k-means :
> 
> En fait, toutes les mthodes de classification comme les PCM, FCM, ..., ont un algorithme itratif du mme genre que les k-means sauf que la recherche des centroides et la rpartition des pixels parmi les centroides se font diffremment c'est a ? (en gros c'est des techniques un peu plus pointues pour de meilleurs rsultats non?)


Oui, c'est a. Au lieu d'affecter un pixel exclusivement  un classe ou  une autre, on l'affecte un peu aux deux classes.

----------


## betsprite

> Pour la mthode "split" il suffit d'arrter lorsqu'on a partag les N plus grandes zones, ce qui limite le nombre d'tapes. *Mais ca implique de devoir calculer les variances sur de trs grandes zones (par exemple avec une "sum image").*


Pourrais-tu dtailler le problme que tu soulignes dans ta dernire phrase concernant le calcul de la variance ? (je n'arrive pas  visualiser le problme)

Merci encore  ::):

----------


## pseudocode

> Pourrais-tu dtailler le problme que tu soulignes dans ta dernire phrase concernant le calcul de la variance ? (je n'arrive pas  visualiser le problme)
> 
> Merci encore


La Sum Image (aussi appele integral image) est une technique permettant de calculer rapidement la somme des valeurs situes dans une zone rectangulaire d'un tableau.

Avec deux Sum Image (l'une contenant les valeurs des pixels, l'autre contenant le carr des valeurs), on peut facilement calculer la formule de la variance sur une zone rectangulaire 

Variance(X) = moyenne(X) - (moyenne(X))

----------


## betsprite

> Avec deux Sum Image (l'une contenant les valeurs des pixels, l'autre contenant le carr des valeurs), on peut facilement calculer la formule de la variance sur une zone rectangulaire 
> 
> Variance(X) = moyenne(X) - (moyenne(X))


*** Ah d'accord. Pour voir si une zone est homogne, tu calcules sa variance (variance en prenant en compte tous les pixels de la zone). Cette variance va ensuite tre compare  un seuil qui va dfinir si la subdivision s'arrte ou non. Cependant, le seuil choisit est *le mme* pour toutes les zones ? (autrement dit, ds que la variance d'une zone quelconque est plus faible que le seuil commun dfinit, le split n'a pas lieu dans cette zone ?)

*** Sinon, en procdant avec la variance, ne risque-t-on pas d'avoir nos N zones mais avec des pixels mal rpartis dans les zones ? (vu que c'est une variance, il est possible qu'on ait  la fin une zone avec des pixels plutot gris et *UN* pixel noir (en variance globale ca passe ...) alors que le pixel noir devrait donc appartenir  une autre zone de pixels noirs ou classe ?)

Aprs, la rponse que je pense avoir  cette question, c'est que c'est qu'une initialisation et qu'elle ne sera pas parfaite sinon l'algorithme des k-means ne servirait  rien... ?

Cependant, avoir une bonne initialisation permet d'avoir moins d'itrations des k-means et donc d'acclrer la classification non ? (si l'tape d'initialisation est moins lourde que l'algorithme des k-means j'imagine ...). Ce qui soulve une autre question intressante :

*** Est-il plus rentable d'affiner une bonne technique d'initialisation des centroides pour diminuer le nombre d'itrations des k-means ou est-ce une perte de temps ?

*** Autre question : Sans prendre en compte les questions d'avant, lorsqu'on a dcoup notre image en N zones assez "homognes", comment initialise-t-on le centroide de la zone ? (on fait tout simplement une moyenne comme dans les itrations des k-means ?)




> La Sum Image (aussi appele integral image) est une technique permettant de calculer rapidement la somme des valeurs situes dans une zone rectangulaire d'un tableau.


*** Pour revenir sur la technique en elle-mme, dans ton lien, il est crit que cette technique requiert seulement 4 parcours de l'image. Mais, etant donn qu'on connait notre zone et donc, quels sont les pixels qui la dlimitent, pourquoi ne serait-il pas plus rapide de faire le calcul de la variance directement dans la zone considre ? (au lieu de faire les calculs de variances dans les zones A, B, C et D puis de faire A + C - B - D pour obtenir celle de la zone ABCD voulue ?)

---------------------------

Beaucoup de questions dans ce message ! J'spre que vous pourrez m'clairer un peu  :;): 

Merci beaucoup !

----------


## pseudocode

> Aprs, la rponse que je pense avoir  cette question, c'est que c'est qu'une initialisation et qu'elle ne sera pas parfaite sinon l'algorithme des k-means ne servirait  rien... ?


Exactement. Il ne s'agit pas de faire une segmentation split/merge, mais juste d'estimer de larges zones a peu prs uniformes, afin de s'en servir comme centroids initiaux.




> *** Est-il plus rentable d'affiner une bonne technique d'initialisation des centroides pour diminuer le nombre d'itrations des k-means ou est-ce une perte de temps ?


Si le but c'est de faire du k-means, il ne faut pas perdre trop de temps  dterminer les centroids. Il vaut mieux avoir une premire approximation rapide.




> *** Autre question : Sans prendre en compte les questions d'avant, lorsqu'on a dcoup notre image en N zones assez "homognes", comment initialise-t-on le centroide de la zone ? (on fait tout simplement une moyenne comme dans les itrations des k-means ?)


Oui, faire une simple moyenne me semble une bonne ide.




> *** Pour revenir sur la technique en elle-mme, dans ton lien, il est crit que cette technique requiert seulement 4 parcours de l'image.


heu... non. Calculer l'image intgrale ncessite un seul parcours (haut/gauche -> bas/droite)

Ensuite le calcul de la somme dans une zone quelconque ne ncessite que 4 oprations (2 additions, 2 soustractions).

----------


## betsprite

Merci pseudocode encore une fois pour ton intervention  ::): 




> heu... non. Calculer l'image intgrale ncessite un seul parcours (haut/gauche -> bas/droite)


Mais l'image intgrale est calcule pour la zone A, B, C et D donc 4 parcours non?

*** Sinon, comment dois-je choisir le critre sur la variance ? Existe-t-il des valeurs cohrentes pour el critre d'arrt de subdivision par la variance ou doit-on trouver la valeur qui nous semble juste en en essayant un certain nombre ?

*** Aussi, pour l'algorithme de division ou split utilis pour dfinir mes N classes, ai-je besoin de reprendre la structure du "tree" ou arbre avec en racine l'image initiale et en noeuds fils les 4 divisions, etc ... ? Est-ce que je ne pourrais pas plus simplement juste conserver les valeurs de variance qui m'intressent dans les rgions rpondant au critre jusqu' en avoir N ?  (en fait, pourquoi devrais-je reprendre la structure de l'arbre dans mon cas alors que je ne cherche pas  implmenter l'algorithme de split mais juste m'en inspirer pour trouver N classes initiales ?)

Merci  :;):

----------


## pseudocode

> Merci pseudocode encore une fois pour ton intervention 
> 
> Mais l'image intgrale est calcule pour la zone A, B, C et D donc 4 parcours non?


Non, l'image intgrale est calcule une fois pour toute, indpendamment de la zone qui nous intresse. C'est l'avantage de la mthode. Une fois cette image calcule, il est tres rapide d'avoir la somme des pixels dans un rectangle quelconque.

C'est une technique que j'utilise assez souvent :



```

```






> *** Sinon, comment dois-je choisir le critre sur la variance ? Existe-t-il des valeurs cohrentes pour el critre d'arrt de subdivision par la variance ou doit-on trouver la valeur qui nous semble juste en en essayant un certain nombre ?


Vaste question a laquelle je n'ai pas de rponse universelle. Pour commencer, on peut calculer la variance globale de l'image et fixer le seuil  1/2 ou 1/4 de cette valeur.




> *** Aussi, pour l'algorithme de division ou split utilis pour dfinir mes N classes, ai-je besoin de reprendre la structure du "tree" ou arbre avec en racine l'image initiale et en noeuds fils les 4 divisions, etc ... ? Est-ce que je ne pourrais pas plus simplement juste conserver les valeurs de variance qui m'intressent dans les rgions rpondant au critre jusqu' en avoir N ?  (en fait, pourquoi devrais-je reprendre la structure de l'arbre dans mon cas alors que je ne cherche pas  implmenter l'algorithme de split mais juste m'en inspirer pour trouver N classes initiales ?)


A mon sens, il n'y a pas de raison de construire un QuadTree. Il faut juste dcouper successivement les plus grosses zones jusqu'a  avoir les N premires zones homognes.

----------


## betsprite

> Non, l'image intgrale est calcule une fois pour toute, indpendamment de la zone qui nous intresse. C'est l'avantage de la mthode. Une fois cette image calcule, il est tres rapide d'avoir la somme des pixels dans un rectangle quelconque.


Mais pour moi, lorsqu'on crit ii(A) + ii(C) - ii(B) - ii(D), on fait appel 4 fois  la fonction ii(x,y) dfinit plus haut et ce ii(x,y) calcul la somme de l'image comprise entre l'origine en haut  gauche et le point en bas  droite reprsent par (x,y). Donc 4 fois le calcul  faire... (enfin voici mon raisonnement, peut tre que l'erreur de mon raisonnement sera ainsi plus claire  ::P: )

Edit : En fait, ce qui me drange surtout, c'est que, tant donn que je vais faire une rcursion sur l'image, je n'aurais pas besoin d'utiliser la technique ii(A) +ii(C) - ii(B) - ii(D) puiqu' chaque division, la nouvelle "image intgrale" sera mon bloc subdivis. Je ne sais pas si mon problme est clair ?




> A mon sens, il n'y a pas de raison de construire un QuadTree. Il faut juste dcouper successivement les plus grosses zones jusqu'a  avoir les N premires zones homognes.


Encore faut-il stocker, lorsque le critre est rempli dans une zone et que la subdivision s'arrte, la valeur de la variance retenue pour le centroide de la rgion. Je fais donc une rcursion pour le split qui continue tant que j'ai pas mes N classes, et dans la rcursion je teste mon critre. S'il est vrifi, je stocke la valeur du centroide (moyenne des pixels) dans un vecteur. Que penses-tu du raisonnement ?

Merci encore ...  ::):

----------


## pseudocode

> Mais pour moi, lorsqu'on crit ii(A) + ii(C) - ii(B) - ii(D), on fait appel 4 fois  la fonction ii(x,y) dfinit plus haut et ce ii(x,y) calcul la somme de l'image comprise entre l'origine en haut  gauche et le point en bas  droite reprsent par (x,y). Donc 4 fois le calcul  faire... (enfin voici mon raisonnement, peut tre que l'erreur de mon raisonnement sera ainsi plus claire )


l'image intgrale est calcule une fois pour toute (en un seul parcours) => on obtient donc un tableau "ii" (de la meme taille que l'image) dont chaque case (x,y) contient la valeur de la fonction.

Une fois qu'on a calcul ce tableau, pour obtenir la valeur ii(A) il suffit de lire la case du tableau. 




> Encore faut-il stocker, lorsque le critre est rempli dans une zone et que la subdivision s'arrte, la valeur de la variance retenue pour le centroide de la rgion. Je fais donc une rcursion pour le split qui continue tant que j'ai pas mes N classes, et dans la rcursion je teste mon critre. S'il est vrifi, je stocke la valeur du centroide (moyenne des pixels) dans un vecteur. Que penses-tu du raisonnement ?
> 
> Merci encore ...


Il suffit de deux listes:
- LZ = Liste des zones  explorer  (trie par taille de zone dcroissante)
- LH = Liste des zones homognes

Au dpart LZ contient une seule zone de la taille de l'image, et LH est vide.

L'algorithme est alors simple:
1. Extraire la premire zone "z" dans la liste LZ
2. Calculer sa variance : var(z)
3a. Si var(z) < seuil, ajouter z dans la liste LH
3b. Si var(z) >= seuil, splitter z en 4 zones et ajouter ces 4 zones dans la liste LZ
4. retour au 1, tant que LH ne contient pas N elements

----------


## betsprite

> Il suffit de deux listes:
> - LZ = Liste des zones  explorer (trie par taille de zone dcroissante)
> - LH = Liste des zones homognes


Quand tu dis liste de zones, sous quelle forme peut-on optimiser le stockage des zones ? zone est vraiment un "objet" ou une classe implmente sous forme d'une matrice ? Si oui, ca demande un stockage de beaucoup de donnes.




> 1. Extraire la premire zone "z" dans la liste LZ


Quand tu dis extraire, c'est la traiter tout en la supprimant de la liste LZ ? (Comme ca  chaque fois on traite seulement le premier lment du tableau qui change tout le temps ?)

Du coup, si j'ai bien compris ton algo, on aurait par exemple (sous forme algorithmique assez grossire) :



```

```

Sinon, tu ne passes donc pas par une recursion du genre :



```

```

Que penses-tu de cette faon de procder ?

Merci !!

----------


## pseudocode

> Quand tu dis liste de zones, sous quelle forme peut-on optimiser le stockage des zones ? zone est vraiment un "objet" ou une classe implmente sous forme d'une matrice ? Si oui, ca demande un stockage de beaucoup de donnes.


Non, une zone c'est simplement la dfinition du rectangle : par exemple dans le format { x,y,w,h }  (le point haut/gauche , largeur , hauteur).

Ca fait seulement 4 entiers a stocker pour chaque zone.




> Que penses-tu de cette faon de procder ?


Les 2 mthodes sont similaires. La rcursion tant terminale, on peut remplacer la rcursion par une boucle.

Ce qui est important, c'est de toujours extraire de LZ la plus grande zone, afin de trouver d'abord les plus grandes zones homognes.

----------


## betsprite

> Ce qui est important, c'est de toujours extraire de LZ la plus grande zone, afin de trouver d'abord les plus grandes zones homognes.


Justement, avec ta mthode, on voit clairement qu'on aura toujours au dbut de la liste LZ la zone ou l'une des plus grandes zones (si splitt de 4 zones de mme taille) de la partition.

Par contre, avec la mthode rcursive, je ne sais pas si l'ordre d'homognit d'une zone est aussi vident. Enfin quoique, c'est une dmarche procdurale donc qu'il y a tout de mme un ordre mais imaginons qu'on ait :

- Mthode rcursive appele une premire fois avec l'image de dpart
- Cas ou on split, mthode rcursive appele pour zone1, zone2, zone3, zone4
- Comme c'est procdurale, mthode rcursive d'abord applique  zone1
- Cas ou on split zone1, mthode rcursive appele pour zone11, zone12, zone13, zone14

Par contre, arriv ici, j'imagine que je vais avoir d'abord la mthode rcursive applique  zone 11 et non pas  ZONE2 qui est plus grande :s

Comment grer ce problme dans la mthode rcursive ? (mme une condition pour voir si la zone concerne est bien plus petite que les autres semble difficile tant donn que c'est rcursif et qu'une zone ne connait donc pas forcment les autres dans la mthode :s alors que dans ta mthode, on a clairement une liste des zones  exploiter donc une zone connait les autres...)

Une ide ?

Merci  :;):

----------


## pseudocode

> Par contre, arriv ici, j'imagine que je vais avoir d'abord la mthode rcursive applique  zone 11 et non pas  ZONE2 qui est plus grande :s
> 
> Comment grer ce problme dans la mthode rcursive ?


Aucune ide. Je ne sais meme pas si c'est possible. 

C'est pour cela que la mthode avec la pile est beaucoup plus pratique.  ::D:

----------


## betsprite

Merci pseudocode  :;): 

J'ai commenc  implmenter la mthode avec la pile. Seulement, je rencontre un petit soucis :

Pour la variance, je fais deux sumImage :

- L'un me donne donc un tableau avec pour chaque position la somme des valeurs des pixels de la zone balaye en haut  gauche de ce point.

- L'autre me donne un tableau avec pour chaque position la somme des carrs des valeurs des pixels de la zone balaye en haut  gauche de ce point.

(le premier tableau va me permettre de calculer (moyenne(X))^2 et le deuxieme de calculer moyenne(X^2)).

Seulement voila, lorsque je dpasse une rsolution de 415x415 pixels pour l'image initiale, le calcul du deuxieme tableau (somme des X^2) explose on dirait. Les valeurs semblent trop importantes et l'application semble plante (plus d'affichage de l'image ni des premieres valeurs des tableaux (que j'avais fait pour vrifier les calculs)).

Comment grer ce problme ?

Merci  :;):

----------


## pseudocode

> Seulement voila, lorsque je dpasse une rsolution de 415x415 pixels pour l'image initiale, le calcul du deuxieme tableau (somme des X^2) explose on dirait. Les valeurs semblent trop importantes et l'application semble plante (plus d'affichage de l'image ni des premieres valeurs des tableaux (que j'avais fait pour vrifier les calculs)).
> 
> Comment grer ce problme ?


Pour une image 415x415, la valeur maximale du tableau 2 (= la dernire case) est de 415*415*(255^2) = 11198930625. Cette valeur tient sur 34 bits.

Donc il faut au minimum utiliser un type "long" pour stocker les donnes du tableau.

(Utilise des long te permet de grer des images 12000000x12000000, ca laisse de la marge  ::D:  )

----------


## betsprite

Merci pseudocode pour ta rponse  :;): 




> Donc il faut au minimum utiliser un type "long" pour stocker les donnes du tableau.


J'ai essay de remplacer mes double par des long mais toujours le mme problme :s

Voici pourtant ma mthode sumImage avec seulement la somme des carrs des valeurs et mon main ou j'affiche (en openCV):

Mthode :



```

```

Main :



```

```

Si je diminue mon image de 420x420, le programme fonctionne, et j'obtiens l'cran du screen 2 (avec l'image qui apparat en gris et disparait aussi vite qu'elle est arriv donc pas le temps de la prendre en capture). Sinon, j'obtiens l'cran du screen 1.

(Bon l'image prise en exemple est pas terrible c'est vrai :p)

Si jamais vous avez une ide n'hsitez pas  :;): 

Merci !

----------


## pseudocode

> Si jamais vous avez une ide n'hsitez pas


Il y a une Access Violation quelque part. Une lecture/ecriture en dehors d'une zone mmoire autorise. 

Au fait, dans opencv il y a deja une fonction qui s'occupe de construire les images intgrales de pixels et de pixels^2.

cvIntegral()

 :;):

----------


## betsprite

> Il y a une Access Violation quelque part. Une lecture/ecriture en dehors d'une zone mmoire autorise.
> Au fait, dans opencv il y a deja une fonction qui s'occupe de construire les images intgrales de pixels et de pixels^2.


C'est bon  savoir  ::P: 
Je vais essayer de passer par la mthode dj existante pour voir.

Par contre, en regardant le prototypage de la mthode, on peut remarquer que celle-ci prend en entre des CvArr. Or, j'ai vu plusieurs postes qui soulvent le problme d'un hritage non vident si,  la place de CvArr, on entre un IplImage pour l'image et une CvMat pour la sum...



```

```

Aussi, pour l'instant, j'avais utilis des vector du C++ pour construire mes matrices. Je voulais utiliser CvMat au dpart mais pour un simple tableau de donnes que reprsente par exemple sum, ca me drangeait de devoir donner un nombre de canaux (car ca n'a pas de sens pour une matrice simple non?).

Sinon pour la profondeur, si je prends CV_32FC1 donc des flottants, c'est suffisant ici ? ( moins qu'il y ait un type long disponible).

Merci !

----------


## pseudocode

> Sinon pour la profondeur, si je prends CV_32FC1 donc des flottants, c'est suffisant ici ? ( moins qu'il y ait un type long disponible).


Oui, les float sont largement suffisant pour ce que tu veux faire ici : il s'agit juste d'estimer la variance pour trouver des zones homognes dans le but d'avoir une initialisation des centroids. C'est pas bien grave si le calcul de variance n'est pas d'une prcision absolue.  ::mrgreen::

----------


## betsprite

Merci pseudocode  :;): 

Petit problme cependant encore ..  ::?: 

J'ai donc le code simple suivant pour calculervia cvIntegral la somme des pixels et la somme au carr :



```

```

Mais  la compilation, bien qu'il n'y ait pas d'erreurs, j'obtiens le message de la capture "screen" ci-dessous.

En mettant en commentaire l'appelle de la mthode cvIntegral, cette fois, tout fonctionne, et j'obtiens le screen 2.

(Le code est visible directement sur les captures aussi).

Une ide ? 

Merci  ::):

----------


## pseudocode

> Une ide ?


Heu... non. L c'est purement li  l'utilisation de OpenCv. Je ne sais pas d'o ca peut venir.

----------


## betsprite

Bonjour,

J'ai finalement post sur le forum OpenCV o l'on a pu m'aider pour le problme avec cvIntegral. J'utilise donc toujours cvIntegral et cette fois-ci le programme fonctionne quelque soit la rsolution de l'image.

Mais, nouveau petit problme avec le calcule de la variance cette fois  ::P: 

Ma mthode *variance* ressemble  ceci :



```

```

Mais, lorsque j'essaie de construire mon seuil dans le main avec :



```

```

J'obtiens une valeur de 583.61 pour le seuil ^^

Il doit donc y avoir un problme je pense, surement dans le calcul de ma variance, alors que j'ai l'impression d'avoir cod simplement moyenne(X^2) - (moyenne(X))^2.

Une ide ?

Merci  ::):

----------


## pseudocode

> J'obtiens une valeur de 583.61 pour le seuil ^^
> 
> Il doit donc y avoir un problme je pense, surement dans le calcul de ma variance, alors que j'ai l'impression d'avoir cod simplement moyenne(X^2) - (moyenne(X))^2.


Pourquoi est-ce qu'il y aurait un problme ? 

Un seuil de 583.61, ca veut dire une variance de 583.61*4 = 2334.44, c'est  dire un cart-type de sqrt(2334.44)=48.31. Ce qui me parait tout  fait dans la norme habituelle pour une image.

----------


## betsprite

> Un seuil de 583.61, ca veut dire une variance de 583.61*4 = 2334.44, c'est  dire un cart-type de sqrt(2334.44)=48.31. Ce qui me parait tout  fait dans la norme habituelle pour une image.


Ok merci  :;): 

Sinon, encore un petit problme que je ne pensais pas avoir :

Je n'arrive pas simplement  manipuler des types CvRect dans une liste du genre vector<>. Par exemple, lors de l'initialisation des centroides sur le screen ci-dessous, lorsque je dclare une zone CvRect et que je veux rcuprer le premier CvRect de ma liste de zones  explorer LZ avec LZ.begin() (ligne 41), j'ai un problme de convertion.

Le mme problme se manifeste avec les pointeurs sur CvRect.

Une ide ?

Merci  ::):

----------


## betsprite

Bonsoir,

Je me permets de revenir sur ce problme car je ne l'ai toujours pas rsolu malheureusement  ::?: 

Je ne comprends pas bien l'erreur suivante :




> error: conversion from '__gnu_cxx::__normal_iterator<Zone*, std::vector<Zone, std::allocator<Zone> > >' to non-scalar type 'Zone' requested|


lorsque j'cris :



```
Zone z = LZ.begin();
```

pour obtenir le premier lment de la liste des zones (LZ tant une liste de structure Zone ou si on veut de type CvRect c'est pareil).

Une ide ?

Merci  ::):

----------


## pseudocode

> lorsque j'cris :
> 
> 
> 
> ```
> Zone z = LZ.begin();
> ```
> 
> pour obtenir le premier lment de la liste des zones (LZ tant une liste de structure Zone ou si on veut de type CvRect c'est pareil).
> ...


Ca, c'est un problme pour le forum ou la FAQ C++.  :;): 

LZ.begin() revoit un itrateur, et pas un lment. Pour accder  un lment tu as la mthode LZ.at( i ), ou directemente l'oprateur LZ[i].

----------

