Aree comuni tra matrici in MATLAB.

Come sapete studiare Elaborazione delle immagini digitali mi è piaciuto parecchio. E’ stato interessantissimo scoprire tutti i metodi usati per gestire le immagini da parte di un calcolatore. Qualsiasi operazione, anche la più semplice, è frutto di operazioni ben ponderate. Una su tutte? Lo zooming di una immagine.
Siamo abituati a cliccare sui tastini “+” o “-” del nostro visualizzatore d’immagini che non pensiamo mai che scelte debba fare un sistema operativo per soddisfare la nostra operazione.
Una delle più basilari tecniche di zooming prevede il raddoppio delle linee e delle colonne della matrice di uscita e l’assegnazione ad ognuna di queste nuove celle di un nuovo valore che, presumibilmente, dovrà rispecchiare quelli dell’intorno corrispettivo nell’immagine di partenza.

Tutto avviene in pochi istanti tanto che nessuno immagina ci siano calcoli matematici da eseguire (anche se per immagini di grandi dimensioni qualche rallentamento si è abituati ad avvertirlo).

L’esercizio in MATLAB che mi è stato richiesto durante l’esame era di una semplicità spiazzante. Mi ero preparato a equalizzazioni o cose molto più complesse, quando mi sento domandare: “Prese due immagini in bianco e nero (non scala di grigio!), sa generare una nuova immagine contenente le parti in comune?”.

In pratica dovevo fare l’intersezione tra due insiemi con area non nota.

Ho guardato il professore un po’ sorpreso perché sapevo che tradurre la richiesta in codice era una semplice riga ma tant’era la richiesta.

La vera potenza di MATLAB nel gestire matrici è che, il più delle volte, non è necessario effettuare cicli (come faremmo in altri linguaggi di programmazione quando incontriamo array mono o multi dimensionali) per effettuare il confronto dei valori. L’importante è che le due matrici abbiano dimensioni identiche (ma è banale renderle tali: vedi il reshaping di una matrice).

Comunque, il codice per trovare l’intersezione è questo:

% Chiamiamo le immagini di partenza im1 e im2
% (che possiamo aver letto da file o generato durante un programma)
% e im_out l'immagine di uscita

im_out = im1 & im2;

% Ho già finito, mostro l'output.
imshow(im_out);

Ho usato un confronto booleano* tra le due matrici e assegnato il valore alla matrice im_out. Avrei potuto eseguire l’esercizio tramite un ciclo for che scansionava righe e colonne, ma come dicevo, avrebbe sminuito l’efficienza di MATLAB.

L’esercizio era persino più banale di quello dell’altra volta in cui avevo specchiato un’immagine! 🙂

Emanuele

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.