Bonjour tous le monde; j'ai un petit code en Matlab extrait d'un programme de segmentation d'image par le modèle de Ron Kimmel)
tel que "phi" une matrice carré quelconque.
Code : 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 % 'Roughly' correct Phi to be a distance map of its zero set function u=redistance(Phi); u=(sign(Phi)+1)*999999; % set to infinity all positive for i=1:2, l2=2; if i>1 u=(1-sign(Phi))*999999; end % set to infinity all negative while l2>1, v=Update(u,1); l2=sum(sum((u-v).^2)); u=v;; end % while if i>1 u=u-up; else up=u; end % if end % for %----------------------------------------------------------------------------------------------- %Solve |grad u|=F(x,y) parallel version of the FMM function res=Update(u,F) mx=min(u([2:end end],:), u([1 1:end-1],:)); my= min(u(:,[2:end end]), u(:,[1 1:end-1])); delm=(mx-my); mask=(abs(delm)<F); res=min(mask.*(mx+my+sqrt(2.*F.^2-delm.^2))./2+... (1-mask).*(min(mx,my)+F),u);
j'ai essayer de convertir ce code en C++ Builder (manuellement), mais je ne sais pas si je suis juste ou non, alors s'il y a quelqu'un qui peuvent m'aider je le remercie d'avance.
voici le code que j'ai écrit:
pour la fonction "redistance"
et pour la fonction "Update ":
Code : 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 void __fastcall TForm1::redistance(float **phi, int H, int W) { float**up=new float*[H]; // la heuteur de l'image for(int i=0;i<H;i++) { up[i]=new float[W]; // la largeur de l'image } float**v=new float*[H]; for(int i=0;i<H;i++) { v[i]=new float[W]; } float l2, l22; for (int i=0;i<H;i++) for (int j=0;j<W;j++) { phi[i][j]=(fctsign(phi[i][j])+1)*999999; // fixé le tous positif } for (int z=1;z<3;z++) { l2=2; if (z>1) { for (int i=0;i<H;i++) for (int j=0;j<W;j++) { phi[i][j]=(1-fctsign(phi[i][j]))*999999; //fixé le tous négative } } // end if while (l2>1) { Updt(phi,v,H,W); // fonction update l22=0; for (int i=1;i<H-1;i++) for (int j=1;j<W-1;j++) { l22=l22+pow((phi[i][j]-v[i][j]),2); } l2=l22; for (int i=1;i<H-1;i++) for (int j=1;j<W-1;j++) { phi[i][j]=v[i][j]; } } // end while if (z>1) { for (int i=0;i<H;i++) for (int j=0;j<W;j++) { phi[i][j]=phi[i][j]-up[i][j]; } } else { for (int i=0;i<H;i++) for (int j=0;j<W;j++) { up[i][j]=phi[i][j]; } } }// end for z for (int i=0;i<H;i++) delete[]up[i]; delete[]up; for (int i=0;i<H;i++) delete[]v[i]; delete[]v; }
et s'il y a des fautes merci de bien les signalées.
Code : 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 void __fastcall TForm1::Updt(float **u,float **v, int H, int W) { float mx,my,diff,minimum; //Résoudre l'équation |grad u|=F(x,y) // déclaration de la matrice mask float**mask=new float*[H]; for(int i=0;i<H;i++) { mask[i]=new float[W]; } // déclaration de la matrice produit float**produit=new float*[H]; for(int i=0;i<H;i++) { produit[i]=new float[W]; } for (int i=1;i<H-1;i++) for (int j=1;j<W-1;j++) { my=min(u[i][j+1],u[i][j-1]); mx=min(u[i+1][j],u[i-1][j]); minimum=min(mx,my); diff=mx-my; if (abs(diff)<1) // abs(mx-my)<1 { mask[i][j]=1; produit[i][j]=mask[i][j]*((mx+my+sqrt(2-(diff*diff)))/(2+((1-mask[i][j])*(minimum+1)))); } else { mask[i][j]=0; produit[i][j]=0; } } for (int i=1;i<H-1;i++) for (int j=1;j<W-1;j++) { v[i][j]=min(produit[i][j],u[i][j]); } // Libération de mémoire for(int i=0;i<H;i++) delete[]mask[i]; delete[]mask; for(int i=0;i<H;i++) delete[]produit[i]; delete[]produit; }
Partager