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.

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:
|