Vision tridimensionelle

Images...

Pour supprimer les avertissements énervants...

Off[General::spell1]

Pour utiliser les graphiques supplementaires...

<< Graphics`Graphics`

Lire une image

im1 = Import["cube1.pgm"]
im2 = Import["cube2.pgm"]
im3 = Import["cube3.pgm"]

Les images chargees sont des graphiques qui peuvent etre affiches directement

Show[im1]

Show[im2]

Show[im3]

im3 // InputForm

Les images couleur fonctionnent aussi...

im1c = Import["face1.ppm"];
im2c = Import["face2.ppm"];
im3c = Import["face3.ppm"];

Show[im1c]
Show[im2c]
Show[im3c]

im3c // InputForm

Les donnees brutes peuvent etre extraites d'un graphique...

im3brute = im3[[1, 1]];
im3brute // MatrixForm

im3cbrute = im3c[[1, 1]];
im3cbrute // MatrixForm

Les dimensions pour les images couleurs sont [y,x,c]. 
Souvent, on veut separer les couleurs, donc avoir les dimensions [c,y,x].
La premiere dimension (Y) passe en 2ieme, la suivante (X) en 3ieme, et la derniere (C) en premier.

data = Transpose[im3cbrute, {2, 3, 1}];
data[[1]]  //  MatrixForm
data[[2]] // MatrixForm
data[[3]] // MatrixForm

Ecrire une image

Pour sauvegarder une image, on fait comme pour n'importe quel graphique...

Show[im2]

Export["res1.pgm", im2];
Export["res1.jpg", im2];
Export["res1.eps", im2]; 
Export["res1.pdf", im2];

Export["res2.ppm", im2c];

Travailler avec des images...

afficheImage[v_, opt___] := 
        ListDensityPlot[v, Mesh -> False, PlotRange -> All, 
          opt];

Show[im3]

afficheImage[im3brute]

ATTENTION: L'element [[1,1]] est au bas de l'image.

ATTENTION: les dimensions des images sont [[Y,X]]

ATTENTION: ListDensityPlot reajuste l'intervalle des intensites selon le Min et le Max.

im = im3brute; 
    im[[1, 2]] = 255;    
g0 = afficheImage[im];

Dessiner par dessus une images...

?Random

pts = 
        Partition[Table[Random[Integer, {0, 19}] + 0.5, {i, 1, 10}], 
          2];
pts // MatrixForm

g1 = Graphics[{RGBColor[0, 1, 0], PointSize[0.03], Point  /@  pts}]; 
    Show[g1]

g2 = Graphics[{RGBColor[1, 0, 0], Thickness[0.01], Line[pts]}]; 
    Show[g2]

Show[g1, g2]

g3 = Show[g0, g2, g1]

On peut aussi utiliser DisplayTogether pour superposer des graphiques. Tres pratique.

On sauvegarde le resultat...

Export["res3.jpg", g3, ImageSize -> 512];

Export["res3.eps", g3];

Interpoler et distortionner des images

On peut transformer en continu une liste de nombres discrets.

data = {4, 2, 7, 5, 2, 8};

On donne l'intervalle utile des donnees pour chaque dimension. En general pour une liste c'est 1..Length[L].
Pour une image, on prefere utiliser 0..Length[L]-1

f1 = ListInterpolation[data, {{1, 6}}]
f2 = 
      ListInterpolation[data, {{1, 6}}, 
        InterpolationOrder -> 1]

On utilise ici le := pour ne pas evaluer tout de suite g10.
L'evaluation se fera quand on utilisera g10.

g10 := ListPlot[data, PlotStyle -> {PointSize[0.05]}]

DisplayTogether[
      Plot[f2[x], {x, 1, 6}, PlotStyle -> {RGBColor[1, 0, 0]}], 
      Plot[f1[x], {x, 1, 6}], g10]

Un peu de symbolique?

data = {a, b, c, d};
f3 = ListInterpolation[data, {{1, 4}}];
f4 = 
        ListInterpolation[data, {{1, 4}}, 
          InterpolationOrder -> 1];

f3[1]
Simplify[f3[1.5]]
Simplify[f3[2.5]]

f4[1]
Simplify[f4[1.5]]
Simplify[f4[2.5]]

Une image

afficheImage[im3brute, Frame -> False]

{ys, xs} = Dimensions[im3brute]

f2 = 
        ListInterpolation[im3brute, {{0, ys - 1}, {0, xs - 1}}];

im3brute[[1, 1]]
f2[0, 0]

f2[0.5, 0.5]

Puisqu'on doit utiliser f2[y,x], on peut faire une fonction plus agreable qui test si on est a l'exterieur de l'image...

f2i[{x_, y_}] := 
        If[x < 0  ||  y < 0  ||  x > xs - 1  ||  y > ys - 1, 0, 
          f2[y, x]];

f2i[{100, 100}]

Comment appliquer une deformation?

On definit la deformation inverse comme une fonction de (x,y)

ex[{x_, y_}] := {y, x};

rot2d[{x_, y_}, 
          a_] := {{Cos[a], Sin[a]}, {-Sin[a], Cos[a]}} . {x, 
            y};

deform[{x_, y_}, a_] := 
        rot2d[{x, y} - {xs, ys}/2, a] + {xs, ys}/2;

deform[{x, y}, Pi/4]

On remplit l'image finale avec les valeurs interpolee de l'image de depart

original = 
        Table[f2i[{x, y}], {y, 0, ys - 1}, {x, 0, 
            xs - 1}];
afficheImage[original]

original = 
        Table[f2i[deform[{x, y}, Pi/8]], {y, 0, ys - 1}, {x, 0, 
            xs - 1}];
afficheImage[original]

Une petite animation?

g9 = 
      Table[
afficheImage[
          Table[f2i[deform[{x, y}, k]], {y, 0, ys - 1}, {x, 0, 
              xs - 1}]]
, {k, 0, 2  Pi, Pi/8}]

Export["anim.gif", g9, "GIF"]