Code lent / programation vectorielle
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):
Code:
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 |
voilà, ce code est hyper long à l'exécution (je ne comprends pas trop pourquoi, le changement de var sans doute)
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:
Code:
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 |
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 !!! :)
Merci d'avance !