Archives du mot-clé rot90

MATLAB R2014a : amélioration des fonctions rot90, flipud et fliplr pour les tableaux 3D

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.