# Gnral Dveloppement > Algorithme & Mathmatiques > Traitement d'images >  Redressement d'image (gomtrie projective)

## jp_developpeur

Bonjour,

J'aurais besoin d'un algorithme (voire code) me permettant de redresser une image. Au lieu de la voir une route en perspective par exemple, je la verrai vu d'avion. Je code sous matlab. Je connais quelques principes comme le fait de prendre des points fixes sur l'image en perspective et de dire qu'ils sont  l'infinis sur l'iamge reel (vu d'avion) mais je n'y arrive pas.
Ce qu'il me faudrai c'est la  matrice de passage entre ces deux images.

Merci d'avance,

JP

----------


## ArgusAzure

Je chercherais du cot de l'homographie si j'ai quelque points en correspondance entre les 2 images.

----------


## jp_developpeur

> Je chercherais du cot de l'homographie si j'ai quelque points en correspondance entre les 2 images.


OK pour l'info mais je trouve pas grd chose. Je sais que c'est cela que je dois faire (prendre quelques points de l'image en perspective) et retrouver les "vraies" coordonnes dans l'image redresse. Seulement ma question est comment dterminer cette matrice de passage ente les 2 images?

merci

JP

----------


## ToTo13

Bonjour,

mmm... il me semble ( confirmer) que le package imagescience(s).jar utilis dans certains plugins de ImageJ fait ce genre de chose.

Sinon est ce qu'un petite lanc de rayon de pourrait pas suffire pour ton problme ?

----------


## jp_developpeur

> Bonjour,
> 
> mmm... il me semble ( confirmer) que le package imagescience(s).jar utilis dans certains plugins de ImageJ fait ce genre de chose.
> 
> Sinon est ce qu'un petite lanc de rayon de pourrait pas suffire pour ton problme ?


Pour le moment je n'ai encore rien cod sur cela.
J'ai commenc par travailler sur papier mais j'arrivais  des resolution de systemes impossibles. ::cry:: . Je n'arrive pas  voir o sont la ou les erreurs. C'est pour cela que j'ai besoin d'aide!!!!

Je travaille sous Matlab.

Merci de m'aider


JP

----------


## ArgusAzure

```

```

C'est du tout cuit pour matlab.

----------


## jp_developpeur

> ```
> 
> ```
> 
> C'est du tout cuit pour matlab.




Merci ArgusAzure!!!!!!!!!!!!!!!!!!!!!!!!!! ::king:: 
je teste a et je te redis si a fonctionne!!!

a+

JP

----------


## ArgusAzure

Petite rectification 


```

```

Alors, a march' ti ?

----------


## pseudocode

Pour info: Projective Mappings for Image Warping  :;): 

ArgusAzure  ::king::

----------


## jp_developpeur

J'ai fait un mixte de tous ce que g trouv sur internet mais je n'arrive pas  obtenir l'image redress (vue d'avion). Il y a mon code en piece jointe. Il s'agit de la dernire boucle: au lieu de m'afficher tous les pixels, j'observe qu'une valeur de pixel. Comment resoudre ce pb mais egalement est ce que mon pgm fonctionnera. J'utilise 2 pts de fuite avc une origine. Pour le moment, je me moque du faccteur entre les deux images.

Merci de m'aider, c'est assez urgent.

JP

PS:Le pgm est un peu long (si vs trouvez un moyen pour l'allger en tps de calcul).

----------


## pseudocode

Je peux le faire en Java, mais en Matlab: non.  ::aie:: 

Le programme principal:


```

```


Et les algos de calcul issus du PDF dont j'ai donn le lien ci-avant


```

```

----------


## jp_developpeur

Merci pseudocode, c'est genial!!!! ::king::

----------


## jokoss

merci  pseudocode et ArgusAzure, je me suis galement inspir de vos posts pour implmenter une solution par cette technique. J'tais justement en train de me tourner vers cette mthode mais dans les articles que j'avais, ils ne parlaient pas du raccourci de la rsolution du systme.

J'aurai tout de mme une question, es-t-il possible , grce aux points de fuite ou autre, de retrouver le rapport largeur sur longueur du rectangle initial, car cette technique demande la largeur et longueur de sortie du rectangle.

Ca doit surement tre relativement simple mais ce n'est pas vident de faire des recherches sur ce sujet.

Merci  vous.

----------


## ArgusAzure

La technique que j'exposais ncessite 4 correspondants, le plus loigns possible pour rduite les erreurs et non aligns. Mais ils ne sont pas forcment les coins d'un rectangle dans l'image "redresse" mme si dans la pratique, c'est souvent le cas.

----------


## jokoss

oui je sais que ca ne correspond pas forcment  un rectangle mais dans mon cas c'est le cas. 

J'aimerai juste pouvoir connatre les relles proportions du rectangle de dpart (pas forcment les tailles mais au moins les proportions. Mme si connatre les tailles serai encore mieux.

merci.

----------


## pseudocode

> La technique que j'exposais ncessite 4 correspondants, le plus loigns possible pour rduite les erreurs et non aligns.


Ta technique est bien plus genrale que celle que j'ai expos. D'un autre cot, le fait de se limiter a un rectangle permet de simplifier la rsolution du systme.




> J'aimerai juste pouvoir connatre les relles proportions du rectangle de dpart (pas forcment les tailles mais au moins les proportions. Mme si connatre les tailles serai encore mieux.


Hum... je ne suis pas sur que ce soit possible. Si quelqu'un  des infos...

----------


## ArgusAzure

> J'aimerai juste pouvoir connatre les relles proportions du rectangle de dpart (pas forcment les tailles mais au moins les proportions. Mme si connatre les tailles serai encore mieux.


La taille en quoi en mtres? En pixels, je ne vois pas ce que a veut dire.

----------


## jokoss

Non certainement pas la taille en mtre. Soit une taille en pixel. Par exemple imaginons que l'on prenne en photo un rectangle en perspective, peut-on connatre la taille (en pixel) de la mme image si elle avait t prise de face.

A dfaut d'une taille , une proportion longueur-largeur serai intrressante aussi.

----------


## ArgusAzure

> Non certainement pas la taille en mtre. Soit une taille en pixel. Par exemple imaginons que l'on prenne en photo un rectangle en perspective, peut-on connatre la taille (en pixel) de la mme image si elle avait t prise de face.


Il faudrait au moins connaitre la distance  laquelle tu te mets pour prendre cette fameuse photo et la dfinition de ton capteur.
 ::roll::

----------


## jokoss

Oui je reconnais que trouver une taille n'a pas de sens car on peut le redresser de diffrente manire et selon cette manire le rectangle se trouverai plus ou moins loin.

Par contre trouver des proportions devrai tre possible logiquement.

Imaginons une forme en trapze (2 cot parallles et les 2 autres se coupant quelque part en un point de fuite), si on prend comme largeur du rectangle redress la longueur du plus grand des 2 cots parallles, on devrai pouvoir en dduire la taille de  la longueur du rectangle. Par exemple on peut dire que plus le point de fuite des 2 cots non parallles est prs, plus la longueur relle du rectangle est grande et inversment si le point de fuite est trs loign, le rectangle n'est quasiment pas dform et donc la longueur apparente est presque correcte.

----------


## ijk-ref

Si ton but est principalement de trouver l'quation permettant de corriger la perspective d'une image, tu devrais lire un peu ceci.

----------


## ijk-ref

Bonjour jp_developpeur, je prfre te rpondre sur le forum  :;): 

Dsol mais je me suis pas trop attarder sur ton code. C'est un langage que je n'ai jamais pratiquer et puis c'est pas trs propre...

Par contre j'ai l'impression que tu ne travailles pas en 2D projective jusqu'au bout.

Je vois tes points fuites avec leurs coordonnes x,y Mais o elle la 3me !?

Faut mieux tout garder a simplifie grandement la reprsentation.

Par exemple l'un des 2 points de fuite M du rectangle A B C D se calcule simplement par :

M = (A^B)^(C^D)  ( '^' : produit vectoriel )

----------


## jp_developpeur

En fait ma troisime coordonne correpond  1 si on a point fixe et 0 si on est  l'infini.

Mais tu l'as dej cod en quel langage? ca pourrait m'intresser si tu l'as fait en C.

En tout cas merci pour ta rep!

JP

----------


## ijk-ref

C#  ::yaisse2:: 

Mon p'tit programme prend en entre 4 points  plac aux quatre coins d'un rectangle dans images et l'affiche bien plate.

Mais bon j'ai juste fais a pour m'amuser il y a quelque temps et c'est pas trs propre.



```

```

En tout cas le principe est :
- trouver le poids des 4 points A,B,C et D en s'aidant des points de fuite

puis aprs suffit de rsoudre la matrice M qui permet d'avoir :
A.M = (0,0,1)
B.M = (1,0,1)
C.M = (0,1,1)

Tu bloques o ?

----------


## jp_developpeur

En fait c ce que j'ai fait mais en prenant un quadrilatre quelconque!

Dans mon programme (dsol de la propret ms je dois me dpch et je garde en commentaire ce que je me suis servie ou ce que je vais me servir), je prend 4 points. ensuite je dtermine 2 points de fuite ((xPF1,yPF1) et (xPF2,yPF2)) grce  l'annulation du dterminant (3 points aligns). De cela je dtermine la matrice M_direct (matrice de passage d'un rectangle  une projection) j'en dduit la matrice inverse (par calcul: formule que j'ai trouv sur net et que j'ai vrifi).
De cela, je parcours avec les indices (i,j) les pixels d'une image ('fictif') j'en dduis les coordonnes sur un carr ou rectangle (peu importe). Avec la matrice M de passage, j'en dduit les coordonnes sur l'image rel. Et de cette dernire j'en dduit (par quation linaire) les indices correspondantes (i1,j1). J'obtiens donc la valeur du pixel de la 'vraie' image que je fais correpondre sur le carr ou rectangle, que je fais correspondre avc les indice (i,j).


Mon pb c'est que j'obtiens une image mais en fait je m'apperoit que l'image rel n'est pas parcourue entirement( avec les indice (i,j) (image redresse) j'obtiens pas tous les indices (i1,j1) de la 'vrai' image.


Pourtant les quations me paraissent juste.

J'ai vraiment besoin d'un coup de main, ::oops:: 

Merci

JP

----------


## ijk-ref

Bon allons par tape :

1/ vrifier si le calcul de la matrice est exacte avec des cas simples.

Pour ma part il suffit juste de rentrer 3 points sources et 3 points destinations.

tu choisis de les placer o tu veux sur ton images sources :
[(x1,y1,1), (x2,y2,1), (x3,y3,1)]

la destination doit ressembler  cela
[(0, 0, 1), (I_MAX, 0, 1), (0, J_MAX, 1)]

La matrice trouve doit vrifier qu'avec le calcul de

r = (0,0,1).M;

on ait bien x1 gal  r.X/r.W et y1 gal  r.Y/r.W

vrifier de mme avec les 2 autres points.

2/ si tu arrives  cela, il suffira juste d'appliquer le bon poids aux points sources comme je l'explique dans mon 1er message post ici.

En tout cas ta faon de faire ne peut pas tre exacte dans tous les cas. Car un point de fuite peut trs bien tre en infini et toi tu ngliges compltement la 3me composante de la "2D projective"

----------


## luxigo

> Je peux le faire en Java, mais en Matlab: non.


Cool ca marche pour passer du systme de coordones du plan de rfrence vers celui du plan de  projection, merci 1000x  ::king:: 

Par contre obtenir la fonction inverse, cad passer des coordones de la projection vers celles du plan de rfrence;

je peux le faire en passant par une table,

mais en modifiant l'algorithme mathmatique, non...

 ben en fait si j'y suis arriv par logique, voir pages suivantes du forum le code source pour opencv  ::): 


J'imagine que vous devriez savoir   ::aie:: 

Merci d'avance !   ::aie:: 




```

```


on m'a demand ppm.h, mais vous n'avez qu' remplacer les types et les noms de procdures par ceux qui vous conviennent...  ::):  

Vous trouverez aussi dans la page suivante du forum le code source pour opencv, qui gre aussi la transformation inverse, au cas o ..  ::): 



```

```

et tant qu' faire le code source de ppm.o .. sans garanties blabla gpl blabla free  ::): 



```

```

----------


## ijk-ref

> Par contre obtenir la fonction inverse, cad passer des coordones de la projection vers celles du plan de rfrence; J'imagine que vous devriez savoir


Ca se rsume  inverser une matrice 3x3  :;):

----------


## luxigo

> Ca se rsume  inverser une matrice 3x3


excellent merci j'ai deja trouv le code ici pour a  ::):

----------


## luxigo

> Je peux le faire en Java, mais en Matlab: non.


encore merci  pseudocode  ::yaisse2:: 

j'ai converti le code en C et j'ai implment un moyen de zoomer, comme si on changeait l'chelle du quadrilatre source par rapport  son centre.. a peut servir..  ::):

----------


## whiteboy

bjr!si tu cherches a calculer l'homographie ,il xiste une bibliotheque prcompil (c/c++):

http://www.ics.forth.gr/~lourakis/homest/

je pense que c est l'une des plus prcise mthode pour stimer l'homographie!

bon courage.

----------


## luxigo

oh bien sur il ya surement plein d'autres libs qui le font d'une faon ou d'une autre  ::): 

Il me semble que l'algorithme post par pseudocode donnait peut-tre un meilleur rsultat,

Il faudra que je teste pour en tre sr.



```

```

----------


## luxigo

> Ca se rsume  inverser une matrice 3x3


Heu pas tout  fait, il manque une tape importante  ::?: 

En fait en relisant http://wcours.gel.ulaval.ca/2006/a/6...projective.pdf avec le code sous les yeux ca devient beaucoup plus clair  ::): 

J'ai finalement russi  deviner z= dans inverse_projective_mapping() pour pouvoir diviser x et y et faire fonctionner la transformation inverse  ::aie:: 

On peut utiliser la matrice adjointe au lieu de l'inverse de la matrice.

On peut aussi multiplier une matrice de transformation avec la matrice adjointe correspondant  un second quadrilatre pour obtenir le passage d'un quadrilatre  un autre via le carr unit en une seule opration.

Cette fois je crois que le cas est  merci  ::king::  

Voil pour opencv, c'est surement plus rapide mais y a pas d'interpolation.



```

```

----------

