Bonjour à tous !
Je débute en matlab sur lequel je dois réaliser un projet de traitement d'images pour un labo... Je dois dans un premier temps faire une transformation de mon image pour éviter les problèmes dus à la courbure de la lentille et à la position de la caméra (pas parfaitement orthogonale au plan qui m'intéresse).
N'ayant pas trouvé de code adéquat pour celà (si vous en avez un qui marche bien, je suis preneur ) j'ai commencé à le programmer.
J'ai réussi à coder ce que je voulais avec des boucles mais c'est extrèmement lent (3h pour traiter une image alors aue je dois faire de la vidéo :p) !! Du coup je veux passer en vectoriel mais ca coince et je ne comprends pas pourquoi...
Mon problème est le suivant: je veux appliquer un changement de variables à une image puis afficher la nouvelle image...
la partie de mon code que je veux changer (avec des boucles):
voilà, ce code est hyper long à l'exécution (je ne comprends pas trop pourquoi, le changement de var sans doute)
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 n=size(f,1) %f est la matrice de l'image à traiter m=size(f,2) imax=0; jmax=0;%these variables will allow us to know what it's the dimension %of the matrix of the new image (after the transformation) %these 2 loops permit to go to every pixel of the initial image for u = 1:m u for v = 1:n [i j]=new_pos(v,u,L);%we get the new position of the pixel, (L c'est des coefficient calculés avant) h(i,j)= f(u,v); %we assign the value of the pixel to is new place in a new matrix h %which is the one of the unditorted image end end imshow(h) end function [i, j] = new_pos(u,v,L)%give the new position of a pixel syms U V real V=((u-L(3))*(L(4)-L(7)*v)-(v-L(6))*(L(1)-L(7)*u))/((L(2)-L(8)*u)*(L(4)-L(7)*v)-(L(5)-L(8)*v)*(L(1)-L(7)*u)); U=((u-L(3))*(L(5)-L(8)*v)-(v-L(6))*(L(2)-L(8)*u))/((L(5)-L(8)*v)*(L(1)-L(7)*u)-(L(4)-L(7)*v)*(L(2)-L(8)*u)); %expression du changement de variable U=round(U);%we transform it in an integer V=round(V); if U<1 %at last we avoid that the position of the pixel is negative or equal to 0 i=1; else i=U; end if V<1 j=1; else j=V; end end
j'ai essayé de le transformer en vectoriel avec des fonctions handle mais je n'arrive pas à savoir comment coder ca en vectoriel et à intégrer la condition avec les if pour éviter d'avoir des positions de pixel négatives ou nulles !!
Est-ce possible ? est-ce judicieux ? Il y a-t-il une autre solution pour accélérer le code ?
mon code:
Quelqu'un pourrait-il m'aider ? J'ai du mal à trouver de la doc sur la programmation en vectoriel, je ne suis même pas sûr que ce soit la meilleure solution... enfin bref je débute donc si vous avez des commentaires, des remarques qui peuvent m'aider je suis preneur !!!
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 n=size(f,1) m=size(f,2) %là je fais le changement de var dans une fonction handle pour pouvoir traiter le tout en vectoriel, j'ai déja un problème parce que les vecteurs u et v ne sont pas de la même taille %et pour faire la soustraction aussi L(1)-L(7).*u je me sais pas comment faire non plus, dois-je écrire (1:n).*L(1)-L(7).*u ? tV=@(u,v) round(((u-L(3)).*(L(4)-L(7).*v)-(v-L(6)).*(L(1)-L(7).*u))./((L(2)-L(8).*u).*(L(4)-L(7).*v)-(L(5)-L(8).*v).*(L(1)-L(7).*u))) tU=@(u,v) round(((u-L(3)).*(L(5)-L(8).*v)-(v-L(6)).*(L(2)-L(8).*u))./((L(5)-L(8).*v).*(L(1)-L(7).*u)-(L(4)-L(7).*v).*(L(2)-L(8).*u))) %et là j'ai essayé plusieurs trucs sans succès %idx = (tV<1); %tV(idx)= 1; ca ne marche pas mais je crois que parce que ce type de condition ne marche que sur des matrices non ? %et surtout j'ai essayé d'intégrer une fonction mais ca ne marche pas non plus :( TU=@(u,v) get_condition(tU); TV=@(u,v) get_condition(tV); h(tU(1:n,1:m),tV(1:n,1:m))= f(1:n,1:m); imshow(h) end function i= get_condition(U) if U<1 %at last we avoid that the position of the pixel is negative or equal to 0 i=1; else i=U; end end
Merci d'avance !
Partager