La prise en charge de tableaux 3D par les fonctions rot90, flipud et fliplr est une des améliorations apportées par la dernière version R2014a de MATLAB. Celle-ci va rendre un service à ceux qui manipulent des images et qui ne possèdent pas l’Image Processing Toolbox.
La prise en charge des tableaux 3D va permettre de simplifier les codes pour faire pivoter une image en couleurs vraies (RGB par exemple) ou pour lui appliquer une transformation miroir.
Analysons ce changement avec l’image « ngc6543a.jpg » livrée avec toutes les versions de MATLAB :
>> I = imread('ngc6543a.jpg', 'jpg');
>> whos I
Name Size Bytes Class Attributes
I 650x600x3 1170000 uint8
Avec MATLAB R2013b ou versions plus anciennes
Jusqu’à présent, il n’était pas possible d’appliquer directement les fonctions :
>> Ir = rot90(I);
Error using rot90 (line 21)
A must be a 2-D matrix.
>> Iflr = fliplr(I);
Error using fliplr (line 18)
X must be a 2-D matrix.
>> Ifud = flipud(I);
Error using flipud (line 19)
X must be a 2-D matrix.
Pour l’effet miroir avec fliplr et flipud, il est possible de travailler avec les indices :
>> Iflr = I(:,end:-1:1,:);
>> Ifud = I(end:-1:1,:,:);
Mais pour la rotation, il faut nécessairement décomposer l’image selon ses trois composantes et recomposer l’image à la fin :
>> I = imread('ngc6543a.jpg', 'jpg');
>> R = I(:,:,1);
>> G = I(:,:,2);
>> B = I(:,:,3);
>> Rr = rot90(R);
>> Gr = rot90(G);
>> Br = rot90(B);
>> Ir = cat(3, Rr, Gr, Br);
>> clear Rr Gr Br
ou plus directement :
>> I = imread('ngc6543a.jpg', 'jpg');
>> Rr = rot90(I(:,:,1));
>> Gr = rot90(I(:,:,2));
>> Br = rot90(I(:,:,3));
>> Ir = cat(3, Rr, Gr, Br);
>> clear Rr Gr Br
Tout ceci n’est pas très optimisé, nuit à la lisibilité du code et nécessite (temporairement) le double de quantité de mémoire.
Avec MATLAB R2014a
Avec les améliorations apportées par la R2014a, il suffit maintenant de faire :
>> I = imread('ngc6543a.jpg', 'jpg');
>> Ir = rot90(I);
>> Iflr = fliplr(I);
>> Ifud = flipud(I);
La lisibilité du code est clairement améliorée.
C’est nettement mieux !
Compatibilité descendante
Seul bémol, les codes développés avec la R2014a ne fonctionneront pas avec les versions plus anciennes.
Pour résoudre ce problème, vous pourrez utiliser la fonction verLessThan disponible depuis MATLAB R2007a.
Par exemple pour effectuer une rotation avec rot90 :
I = imread('ngc6543a.jpg','jpg');
if verLessThan('matlab', '8.3')
Rr = rot90(I(:,:,1));
Gr = rot90(I(:,:,2));
Br = rot90(I(:,:,3));
Ir = cat(3, Rr, Gr, Br);
clear Rr Gr Br
else
Ir = rot90(I);
end
Conclusion
La prise en charge des tableaux 3D par les fonctions rot90, fliplr et flipud était attendue de longue date. C’est chose faite.
Il faudra néanmoins prendre en compte la compatibilité descendante si vous comptez diffuser vos codes à des utilisateurs qui n’auraient pas encore migré vers la R2014a.