mardi 6 avril 2010

Image et monde libre (didactiel 1/5)

Après près d'un an de deuil (voir dernières entrées) et à l'approche des vacances, il est temps d'aborder une nouvelle série d'articles.
Cette série portera sur le traitement d'images tout particulièrement du point de vue du monde libre (ou open source comme le disent les moins sérieux.)
La construction ex-nihilo d'un outil générant un 'droste effect' sur une image en sera le fil conducteur.
Les grandes lignes :
* outils de base
* fondements mathématiques et outils sophistiqués
* mise en oeuvre
* exemples
Tout d'abord, je précise que je travaille sur Kubuntu 9.04 et que, sans précisions supplémentaires, les logiciels présentés sont dans les versions standard que me propose aptitude (NB pour les versions antérieures,il peut être également utile d'installer le package xloadimage).
Le langage de choix sera celui d'Octave (et son format d'images RGB pour les fichiers .img) mais je vais, dans la prochaine entrée, surtout parler d'Haskell qui est un langage idéal pour développer de petits utilitaires.
Les images considérées seront des images couleurs et pour créer une image rouge de hauteur 100 et de largeur 50 de type RGB avec Octave, il faut créer un tableau x à 3 dimensions :
base=255;
x(:,:,1)=base*ones(100,50);
x(:,:,2)=zeros(100,50);
x(:,:,3)=zeros(100,50);
et l'affichage avec Gnuplot s'effectue en faisant :
imshow(x)
Quand on demande l'enregistrement de notre image (pourrie) :
saveimage("pourrie.img",x,"img")
Octave crée le fichier au format img (NB les versions antérieures ne semblent pas se tenir à cette présentation et on devra y parenir en externe après avoir sauvegardé en brut avec save "raw" x puis un réencodage maison) qui a l'allure suivante :
# Created by Octave ...
# name: map
# type: matrix
# rows: 5000
# columns : 3
255 0 0
255 0 0
... (5000 lignes identiques)
255 0 0
# name: img
# type: matrix
# rows: 100
# columns: 50
1 101 201 ... 4901
2 102 202 ... 4902
...
100 200 ... 5000
c'est-à-dire une liste de couleurs suivie d'une matrice de positions de pixels.
Pour retrouver notre image le lendemain, cet arrangement nous oblige à effectuer la lecture de la façon suivante :
[im,map]=loadimage("pourrie.img");
et l'affichage :
imshow(ind2rgb(im,map))

Aucun commentaire:

Enregistrer un commentaire