[EDIT]
OK je vais présenter un peu mieux..

L'"ellipse-fitting", ou en .. franglais le "fit d'ellipse", est l'action de trouver les paramètres d'une ellipse définie par un ensemble de points 2D isolés et bruités, que l'on pense figurer sur une ellipse.

En exemple, voir l'image donnée sur le post http://www.developpez.net/forums/m2213840-1/... . En fait, on a au départ une image (ou un graphique) brut. Certains pixels (positions) sont plus ou moins répartis suivant ce qu'à l'oeil on pense être une ellipse. Cet algorithme trouve les paramètres (1/2 petit et grand axe, ellipticité, centre, angle par rapport à l'horzontale) en prenant l'ensemble des coordonnées des points concernés et en appliquant une méthode des moindres carrés sur la développée de l'équation de l'ellipse.

[/EDIT]



OK.. J'ai retrouvé le code.. Mais c'est du Fortran...

J'essayerais de le traduire en C un de ces jours... Et de donner un exemple d'utilisation

(j'ai gardé la bibliothèque, mais perdu le prog de départ.. Je crois que j'ai une sortie papier quelque part, mais j'aurais pas accès avant un bon mois..)

D'abord les 2 routines de mahs nécessaires (moindres carrés généralisés à 10 paramètres, et résolution d'un système linéaire par élimination de gaussienne :

Code fortran : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
 
C***********************************************************************C
C         GENERALIZED LEAST-SQUARE FOR UP TO 10 PARAMETERS              C
C                     (Jean SOUVIRON - DAO Victoria - 1985)             C
C        (METHOD OF R. SEDGEWICK in ALGORITHMS                          C
C                                   ADDISON-WESLEY PUBLISHING CO.       C
C                                   1984                             )  C
C-----------------------------------------------------------------------C
C                                                                       C
C     INPUT :                                                           C
C           NARAY = NUMBER OF DIFFERENT PARAMETERS+1                    C
C            NDIM = REAL MAX DIMENSION IN THE MAIN PROGRAM              C
C          NTOTAL = TOTAL NUMBER OF POINTS                              C
C          TABOBS = ARRAY OF PARAMETERS FOR EACH POINT                  C
C                   (LAST VECTOR HAS TO BE THE DATA TO BE FITTED)       C
C     OUTPUT :                                                          C
C          FACTOR = ARRAY OF COEFFICIENTS                               C
C                       (DIMENSION MUST BE BUILD IN IN MAIN PROGRAM)    C
C          SIGMA                                                        C
C          IERR   ERROR FLAG                                            C
C                                                                       C
C***********************************************************************C
        SUBROUTINE LEAST(TABOBS,NDIM,NARAY,NTOTAL,FACTOR,SIGMA,IERR)
        DIMENSION TABOBS(NDIM,NARAY),FACTOR(1),COEFF(10,11)
        DIMENSION SOLU(10)
        DOUBLE PRECISION COEFF,SOLU
        DO 757 J=1,10
        SOLU(J)=0.D0
        DO 756 I=1,11
        COEFF(J,I)=0.D0
 756    CONTINUE
 757    CONTINUE
        SIGMA=0.
        NREAL=NARAY-1
        DO 1 I=1,NREAL
        DO 2 J=1,NARAY
        T=0.0
        DO 3 K=1,NTOTAL
        Z1=TABOBS(K,I)
        Z2=TABOBS(K,J)
        T=T+Z1*Z2
3       CONTINUE
        COEFF(I,J)=DBLE(T)
2       CONTINUE
1       CONTINUE
C-----------------
C   SOLVING BY GAUSSIAN ELIMINATION
C-----------------
        CALL LNSYS(COEFF,SOLU,NREAL,IERR)
C-----------------
C  SET UP COEFFICIENTS
C-----------------
        DO 4 I=1,NREAL
        FACTOR(I)=SOLU(I)
4       CONTINUE
        DO 7 I=1,NTOTAL
        ZZ=TABOBS(I,NARAY)
        DO 8 J=1,NREAL
        ZZ=ZZ-FACTOR(J)*TABOBS(I,J)
8       CONTINUE
        IF(ZZ.LE.0.)ZZ=-ZZ
        SIGMA=SIGMA+ZZ
7       CONTINUE
        SIGMA=(SIGMA/FLOATJ(NTOTAL))*SQRT(3.14159/2.)
        RETURN
        END
 
C***********************************************************C
C       SOLVE LINEAR SYSTEM VIA GAUSSIAN ELIMINATION        C
C          ORDER UP TO 10                                   C
C             ( 10.01.1979 K. BANSE )                       C
C                              (SACLAY - HPCCD - 1982/84)   C
C***********************************************************C
        SUBROUTINE LNSYS(ARRAY,X,NORDER,IERR)
        DIMENSION ARRAY(10,11), X(10)
        DOUBLE PRECISION ARRAY, SAVE,RMAX,X
C
C
        IERR=0
        DO 100 K=1,NORDER-1
C--------------------------------- GET LARGEST PIVOTAL ELEMENT
        SAVE=0.D0
        DO 30 J=K,NORDER
        RMAX=DABS(ARRAY(J,K))
        IF(SAVE.GE.RMAX)GO TO 30
        SAVE=RMAX
        MXROW=J
30      CONTINUE
C--------------------------------- EXCHANGE ROWS
        DO 40 J=K,NORDER+1
        SAVE=ARRAY(K,J)
        ARRAY(K,J)=ARRAY(MXROW,J)
        ARRAY(MXROW,J)=SAVE
40      CONTINUE
C--------------------------------- TEST IF ARRAY SINGULAR
        IF(DABS(ARRAY(K,K)).LT.10.D-12) GO TO 300
C--------------------------------- SUBSTRACT ROW FROM LOWER ROWS
        DO 60 I=K+1,NORDER
        SAVE=ARRAY(I,K)/ARRAY(K,K)
        ARRAY(I,K)=0.D0
        DO 61 J=K+1,NORDER+1
        ARRAY(I,J)=ARRAY(I,J)-SAVE*ARRAY(K,J)
61      CONTINUE
60      CONTINUE
100     CONTINUE
C
C       CALCULATE VECTOR X       
C
        X(NORDER)=ARRAY(NORDER,NORDER+1)/ARRAY(NORDER,NORDER)
        DO 200 NN=2,NORDER
        I=NORDER+1-NN
        SAVE=ARRAY(I,NORDER+1)
        DO 150 J=I+1,NORDER
        SAVE=SAVE-ARRAY(I,J)*X(J)
150     CONTINUE
        X(I)=SAVE/ARRAY(I,I)
200     CONTINUE
        GO TO 333
C
C    
300     DO 310 N=1,NORDER
        X(N)=0.0
310     CONTINUE
        IERR=-1
C
333     RETURN 
        END

Et ensuite la vraie routine de fit d'ellipse :

Code fortran : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
 
C*******************************************************************C
C               SUBROUTINE OF ELLIPSES FITTING                      C
C                                                                   C
C            IT TAKES THE GENERAL EQUATION THAT AN ELLIPSE          C
C        HAS TO SATISFY AND FIT BY LEAST-SQUARE THE COEFFICIENTS    C
C        IF THE AXIS WERE ALIGNED WITH X AND Y , THE EQUATION       C
C        WOULD BE :   (X-XC)**2/A2 + (Y-YC)**2/B2 = 1               C
C        WITH A CERTAIN ANGLE ALPH THE COORDINATES TRANSFORMS       C
C        INTO :   X' = COS (APLH) * (X-XC) - SIN (ALPH) * (Y-YC)    C
C                 Y' = SIN (ALPH) * (X-XC) + COS (ALPH) * (Y-YC)    C
C        REPLACING IN THE FORMER EQUATION GIVES AN EQUATION WHOSE   C
C        FORM IS :   A (X-XC)**2 + B (Y-YC)**2 + C X*Y = 1          C
C        A VERY SIMPLE CALCULUS GIVES THE ANSWER FOR THE VALUE      C
C        OF THE DIFFERENT PARAMETERS WHEN THE COEFFICIENTS A,B,C    C
C        ARE DETERMINED BY LEAST-SQUARE.                            C
C                                                                   C
C        THIS ROUTINE ALLOWS THE USER TO FIT ELLIPSES WHERE :       C
C             - THE CENTER IS EITHER KNOWN OR UNKNOWN               C
C             - THE POSITION ANGLE IS EITHER KNOWN OR UNKNOWN       C
C             - THE ELLIPTICITY IS EITHER KNONW OR UNKNOWN          C
C                                                                   C
C        IT IS LIMITED TO 10000 POINTS .                            C
C                                                                   C
C                                                                   C
C    INPUT :                                                        C
C        XX : TABLE OF X COORDINATES                                C
C        YY : TABLE OF Y COORDINATES                                C
C        XCENTR,YCENTR : COORDINATES OF CENTER                      C
C        NPOIN : NUMBER OF POINTS THAT HAVE TO BE FITTED            C
C        INDIC : FLAG FOR DETERMINATION OF CENTER (0) OR NO (1)     C
C        INDIA : FLAG FOR DETERMINATION OF ANGLE (0) OR NO (1)      C
C                (in case of no determination, the value of the     C
C                angle has to be passed by ANG)                     C
C        INDIE : FLAG FOR DETERMINATION OF ELLIPTICITY (0) OR NO(1) C
C                (in case of no determination, the value of the     C
C                ellipticity has to be passed by ELL)               C
C                                                                   C
C    OUTPUT :                                                       C
C        RMAJ,RAVE,ELL,ANG : PARAMETERS OF THE ELLIPSE              C
C        XCENTR,YCENTR : EVENTUALLY NEW COORDINATES CENTER          C
C        SIGM,IERR : SIGMA AND ERROR FLAG                           C
C                                                                   C
C        ( Jean SOUVIRON - DAO Victoria 1985/86)                    C
C                                                                   C
C*******************************************************************C
      SUBROUTINE FITELL(XX,YY,XCENTR,YCENTR,NPOIN,INDIC,INDIA,INDIE,
     +RMAJ,RAVE,ELL,ANG,SIGM,IERR)
      DOUBLE PRECISION F1,F2,F3,G1,G2
      DIMENSION TABFIT(10000,4),XX(1),YY(1),FACTO(3) 
      DIMENSION TABFI1(10000,6),FACTO1(5)
      IERR=0
      IF(INDIC.EQ.1)GO TO 1000
C-----------------------------C
C  CENTER HAS TO BE FOUND     C
C-----------------------------C
200   CORRX=0.
      CORRY=0.
      DO 2500 KKK=1,NPOIN
      TABFI1(KKK,1)=(XX(KKK)-XCENTR)*(XX(KKK)-XCENTR)
      TABFI1(KKK,2)=(YY(KKK)-YCENTR)*(YY(KKK)-YCENTR)
      TABFI1(KKK,3)=(XX(KKK)-XCENTR)*(YY(KKK)-YCENTR)
      TABFI1(KKK,4)=XX(KKK)-XCENTR
      TABFI1(KKK,5)=YY(KKK)-YCENTR
      TABFI1(KKK,6)=1.
2500  CONTINUE
      CALL LEAST(TABFI1,10000,6,NPOIN,FACTO1,ASIGM,IER)
      IF(IER.LT.0)GO TO 5
      DENUM=4.*FACTO1(1)*FACTO1(2)-FACTO1(3)*FACTO1(3)
      IF(DENUM.EQ.0.)GO TO 3
      CORRX=(-2.*FACTO1(2)*FACTO1(4)+FACTO1(3)*FACTO1(5))/DENUM
      XCENTR=XCENTR+CORRX
      CORRY=(FACTO1(3)*FACTO1(4)-2.*FACTO1(1)*FACTO1(5))/DENUM
      YCENTR=YCENTR+CORRY
C
C     CORRECTS THE FACTORS TO TAKE INTO ACCOUNT THE BAD CENTER
C
       CORREC=FACTO1(1)*CORRX*CORRX+FACTO1(2)*CORRY*CORRY
       CORREC=CORREC+FACTO1(3)*CORRX*CORRY
       IF((1.+CORREC).EQ.0.)GO TO 4
       COR=1.-(CORREC/(1.+CORREC))
       FACTO(1)=FACTO1(1)*COR
       FACTO(2)=FACTO1(2)*COR
       FACTO(3)=FACTO1(3)*COR
       GO TO 2000
C-----------------------------C
C  CENTER ALREADY DETERMINED  C
C-----------------------------C
1000  CONTINUE
      DO 4440 KKK=1,NPOIN
      TABFIT(KKK,1)=(XX(KKK)-XCENTR)*(XX(KKK)-XCENTR)
      TABFIT(KKK,2)=(YY(KKK)-YCENTR)*(YY(KKK)-YCENTR)
      TABFIT(KKK,3)=(XX(KKK)-XCENTR)*(YY(KKK)-YCENTR)
      TABFIT(KKK,4)=1.
4440  CONTINUE
      CALL LEAST(TABFIT,10000,4,NPOIN,FACTO,ASIGM,IER)
      IF(IER.LT.0)GO TO 5
C-----------------------------------------C
C     DETERMINATION OF THE PARAMETERS     C
C-----------------------------------------C
2000  CONTINUE
      F1=DBLE(FACTO(1))
      F2=DBLE(FACTO(2))
      F3=DBLE(FACTO(3))
      FACT=180./3.14159
      SIG=ASIGM
      IF(INDIA.EQ.1)GO TO 5000
      IF(INDIE.EQ.1)GO TO 6000
C************************************************************  NORMAL CASE
C
C--------------   COMPONENT ON x-AXIS
C
      G1=F3*F3+(F1-F2)*(F1-F2)
      IF(G1.LE.0.D0)GO TO 1
      G2=(2./(F1+F2+DBLE(SQRT(SNGL(G1)))))
      ZZ1=SNGL(G2)
      IF(ZZ1.LE.0.)GO TO 1
      RMAJ=SQRT(ZZ1)
      A=RMAJ
C
C---------------   COMPONENT ON y-AXIS
C
      ZZ=SNGL(F1+F2-DBLE(1./(RMAJ*RMAJ)))
      IF(ZZ.LE.0.)GO TO 2
      RMIN=1./SQRT(ZZ)
      B=RMIN
      IREVER=0
      IF(RMAJ.GE.RMIN)GO TO 4419
      IREVER=1
      TT=RMAJ
      RMAJ=RMIN
      RMIN=TT
C
C---------------     ELLIPTICITY , AND MEAN AXIS
C
4419  ELL=1.-RMIN/RMAJ
      RAVE=SQRT(RMIN*RMAJ)
C
C---------------    ANGLE
C
C  1)    x/HORIZONTAL
C    SIGN - BECAUSE IT IS THE REVERSE THAT WE WANT (FROM NORMAL TO ELLIPSE)
C
      G1=-F3/(F1-F2+DBLE(1./(A*A))-DBLE(1./(B*B)))
      ARGUM=SNGL(G1)
      ANG=ATAN(ARGUM)*FACT
C
C  2)  CHECK IF x IS MAJOR AXIS
C
      IF(IREVER.EQ.0)GO TO 10
      IF(ANG.GE.0.)GO TO 11
      ANG=ANG+90.
      GO TO 10
11    ANG=ANG-90.
C
C  3)  ANGLE MAJOR AXIS/VERTICAL, UNCLOCKWISE
C
10    ANG=ANG+90.
      RETURN
C********************************************************   CASE OF KNOWN ANGLE
C
C
5000  ANGL=-(ANG-90.)/FACT
      SINU=2.*SIN(ANGL)*COS(ANGL)
      IF(SINU.EQ.0.)SINU=0.000001
      G1=F1+F2
      G2=F1-F2
      ZZ=SNGL(F3/DBLE(SINU)+G1)
      IF(ZZ.LE.0.)GO TO 6
      AA=SQRT(2./ZZ)
      RMAJ=AA
      ZZ=SNGL(G1-F3/DBLE(SINU))
      IF(ZZ.LE.0.)GO TO 6
      BB=SQRT(2./ZZ)
      RMIN=BB
      IF(RMAJ.GE.RMIN)GO TO 5001
      TT=RMAJ
      RMAJ=RMIN
      RMIN=TT
5001  ELL=1.-RMIN/RMAJ
      RAVE=SQRT(RMIN*RMAJ)
      RETURN
C*************************************************   CASE OF KNOWN ELLIPTICITY
C
C
6000  BOVERA=1.-ELL
      G1=F1+F2
      IF(G1.LE.0.D0)GO TO 7
      RMIN=SQRT((1.+BOVERA*BOVERA)/SNGL(G1))
      RMAJ=RMIN/BOVERA
      RAVE=SQRT(RMAJ*RMIN)
      ZZ=SNGL((F1-F2)+DBLE((BOVERA*BOVERA-1.)/(RMIN*RMIN)))
      IF(ZZ.EQ.0.)GO TO 7
      ARGUM=-(SNGL(F3))/ZZ
      ANG=ATAN(ARGUM)*FACT
      ANG=ANG+90.
      RETURN
C
C----------- ERRORS
C
1     IERR=-1
      RETURN
2     IERR=-2
      RETURN
3     IERR=-3
      RETURN
4     IERR=-4
      RETURN
5     IERR=-5
      RETURN
6     IERR=-6
      RETURN
7     IERR=-7
      RETURN
      END


Bon désolé c'est du Fortran.... On verra plus tard..