Home Tutorials Matlab Matlab per l'elaborazione delle immagini digitali: generare un'animazione casuale 'sintetica' con FRAMES e salvarla su disco

Google Translator

 

Effettua una donazione

 

 

 

 

 

Page Rank Check    

 

 

Ultimi articoli

Matlab per l'elaborazione delle immagini digitali: generare un'animazione casuale 'sintetica' con FRAMES e salvarla su disco
Tutorials - Matlab
Scritto da RedBaron85   
Sabato 30 Gennaio 2010 13:38

Matlab per l'elaborazione delle immagini digitali:  generare un'animazione casuale 'sintetica' con FRAMES e salvarla su disco

In questo articolo mostrerò come creare, in Matlab, un'animazione 'sintetica', partendo da un'immagine anch'essa creata al volo, senza input, contenente figure geometriche posizionate casualmente all'interno della stessa, creando dei FRAMES da concatenare, per poi salvare il tutto su disco come FILMATO.


Ebook, videocorsi e tutorials di RedBaron85 su Blender, Java3D e altro su effe12.com


Questo articolo segue direttamente quello dedicato alla generazione di immagini sintetiche e al loro salvataggio mediante Matlab; la prima parte dello script è uguale in tutto e per tutto, salvo per le ultime 3 righe, allo script presentato in tale articolo, per cui non verrà ridiscussa: ci concentreremo, invece, sulla seconda parte.


Ad ogni frame dell'animazione (ciclo for che va da 1 a 25, ma potete impostare un numero di frames o un frame rate differenti, ovviamente) viene aggiunto o sottratto un vettore di spostamento casuale alle figure geometriche, che vengono quindi ridisegnate di volta in volta, nelle nuove posizioni, nell'area di lavoro; dall'immagine dell'area di lavoro bisogna, poi, ricavare un oggetto FRAME, da posizionare all'interno del filmato; il filmato vero e proprio, comunque, verrà creato alla fine, fuori dal ciclo for, e lì potremo impostare il numero di visualizzazioni da effettuare a video e il frame rate.


La variabile 'mappa' si riferisce alla mappa colori creata dalla funzione gray2ind per indicizzare, come suggerisce il nome della funzione stessa, l'immagine (passaggio da immagine a FRAME).


Per memorizzare l'animazione su file, devo creare un oggetto avifile ed aggiungergli tutti i frames creati di volta in volta, memorizzati nel vettore dei frame "frames".


Per maggiori informazioni sui comandi rgb2gray, gray2ind, movie, avifile, ecc..., scrivete 'help [nomeistruzione]' nella Command Window di Matlab.


Lo script mostra a video il filmato e lo salva su disco, con nome file 'filmato.avi'; attenzione: se nella cartella di lavoro è presente un file 'filmato.avi', questo script lo sovrascriverà senza avvisarvi (né prima né dopo)!!!


Per alcuni comandi di manipolazione delle immagini in forma di matrici (size, cicli for, uint8, ...) si rimanda all'articolo, pubblicato precedentemente, sulle basi dell'elaborazione delle immagini digitali mediante Matlab.

 

 

Ecco lo script:

% PRIMA PARTE --- Identica a quella dell'articolo precedente
%
% Impostazioni iniziali: dimensioni (M per l'altezza, N per la larghezza) in pixel dell'area di lavoro-immagine di output e 'disegno' delle figure geometriche (un rettangolo e un triangolo)
clear;
M = 160;
N = 160;
areaLavoro = zeros(M,N,3); % Figure a 3 dimensioni (RGB)
rettangolo = ones(15,10,3);
triangolo = ones(10,10,3);
for i=1:10
for j = (i+1):10
triangolo(i,j,:)=0;
end;
end;
% Genero le coordinate iniziali dei vertici in alto a sinistra delle figure per posizionarle nell'area di lavoro
posInizialeTriangoloX = floor(rand(1) * M);
posInizialeTriangoloY = floor(rand(1) * N);
posInizialeRettangoloX = floor(rand(1) * M);
posInizialeRettangoloY = floor(rand(1) * N);
% Disegno il triangolo e il rettangolo nell'area di lavoro
for i=1:10
for j= 1:10
areaLavoro(posInizialeTriangoloX + i, posInizialeTriangoloY + j) = triangolo(i,j); % Posiziono il triangolo nell'area di lavoro
end;
end;
for i=1:15
for j= 1:10
areaLavoro(posInizialeRettangoloX + i, posInizialeRettangoloY + j) = rettangolo(i,j); % Posiziono il rettangolo nell'area di lavoro
end;
end;
% NON mostro a video e NON salvo l'immagine dell'area di lavoro ottenuta fino a questo punto...
%
% SECONDA PARTE: genero un'animazione. Ad ogni frame, aggiungo o sottraggo un vettore spostamento casuale alla posizione dell'oggetto nel frame precedente
for n=1:25
areaLavoro = zeros(M,N,3); % Ripulisco l'area di lavoro, per "disegnarle sopra" il frame nella nuova posizione
% Applico, alla posizione del triangolo e del rettangolo del frame precedente, uno spostamento casuale, positivo o negativo, lungo x e lungo y
spostamentoCasuale = floor(rand(1)*10) - floor(rand(1)*10);
if(((posInizialeTriangoloX + spostamentoCasuale) > 0) | ((posInizialeTriangoloX+10+spostamentoCasuale)<M-1))
posInizialeTriangoloX = posInizialeTriangoloX + spostamentoCasuale;
end;
spostamentoCasuale = floor(rand(1)*10) - floor(rand(1)*10);
if(((posInizialeTriangoloY + spostamentoCasuale) > 0) | ((posInizialeTriangoloY+10+spostamentoCasuale)<N-1))
posInizialeTriangoloY = posInizialeTriangoloY + spostamentoCasuale;
end;
spostamentoCasuale = floor(rand(1)*10) - floor(rand(1)*10);
if(((posInizialeRettangoloX + spostamentoCasuale) > 0) | ((posInizialeRettangoloX+10+spostamentoCasuale)<M-1))
posInizialeRettangoloX = posInizialeRettangoloX + spostamentoCasuale;
end;
spostamentoCasuale = floor(rand(1)*10) - floor(rand(1)*10);
if(((posInizialeRettangoloY + spostamentoCasuale) > 0) | ((posInizialeRettangoloY+15+spostamentoCasuale)<N-1))
posInizialeRettangoloY = posInizialeRettangoloY + spostamentoCasuale;
end;
% Disegno il triangolo e il rettangolo, con le nuove posizioni, nell'area di lavoro
for i=1:10
for j= 1:10
areaLavoro(posInizialeTriangoloX + i, posInizialeTriangoloY + j) = triangolo(i,j); % Posiziono il triangolo nell'area di lavoro
end;
end;
for i=1:15
for j= 1:10
areaLavoro(posInizialeRettangoloX + i, posInizialeRettangoloY + j) = rettangolo(i,j); % Posiziono il rettangolo nell'area di lavoro
end;
end;
% Dall'immagine ricavo il frame, e lo posiziono all'interno del "filmato" (per il momento, "frames" è solo un vettore di frame, alla fine del for creerò il vero filmato da visualizzare a schermo)
areaLavoro = rgb2gray(areaLavoro);
[frameCorrente, mappa] = gray2ind(areaLavoro,256);
frames(n) = im2frame(frameCorrente, mappa);
end;
% Dal vettore dei frame, ricavo il "movie" da mostrare a video
% Il secondo parametro indica di eseguire la visualizzazione 1 volta, il terzo indica di visualizzare 1 frame al secondo (per poterlo analizzare meglio)
filmato = movie(frames, 1,1);
% Per memorizzare l'animazione su file, devo creare un oggetto avifile ed aggiungergli tutti i frames creati di volta in volta, memorizzati nel vettore dei frame "frames":
filmatoDaSalvareSuDisco = avifile('filmato.avi')
filmatoDaSalvareSuDisco.Compression='None'; % Sono disponibili altri tipi di compressione; digitate help avifile nella Command Window per maggiori informazioni
for n=1:25
filmatoDaSalvareSuDisco = addframe(filmatoDaSalvareSuDisco, frames(n));
end;
filmatoDaSalvareSuDisco = close(filmatoDaSalvareSuDisco);

E' tutto, a presto!

 


Risorse consigliate su Matlab:


                 

 

Tags:     tutorial      matlab      script      scripting      elaborazione      immagini digitali      animazione casuale      animazione sintetica      frames      salvare animazione
Ultimo aggiornamento Martedì 05 Febbraio 2013 22:49
 

 

Ricerca personalizzata

 

Milanese Francesco - Partita IVA: 04950350878

Copyright © 2013 RedBaron85.com: Informatica, CG 2D e 3D, Blender, Python, Java 2D e 3D, 3D Studio e altro ancora!. Tutti i diritti riservati.
Joomla! è un software libero rilasciato sotto licenza GNU/GPL.
AltroArticoliblog utentiBlueprintsContestenglishProgrammazioneModelliElencoNewsTexturesTutorialsVideotutorials