Scomposizione RGB di un'immagine colori
Immagini a colori sono rese attraverso il modello RGB dove
l'intensità di ciascuno dei colori fondamentali viene
memorizzata in un piano
di colore separato.
Prendiamo l'immagine di prova RGB.png
ottenuta
fotografando la sovrapposizione di 3 sorgenti corrispondenti
ai 3 colori di base
Scaricate il file di questa immagine
e quindi
leggetelo con il comando
imread
di Octave. Lo
scopo dell'esercizio è verificare
- Come octave rappresenta internamente un'immagine a colori
- Realizzare la corrispondenza tra sorgenti e piani di colore
- Verificare le conseguenze della rappresentazione interna dei dati
Il comando imread
ammette come argomento il path al
file dell'immagine. Se avete salvato l'immagine nella cartella di lavoro corrente
allora sarà sufficiente specificare il nome del file.
Questa funzione è in grado di riconoscere i più
comuni formati di immagine e restituisce una matrice che dipende
dalla rappresentazione usata nel file grafico (grayscale, RGB, indexed).
Leggiamo il file RGB.png e osserviamo la dimensione della
matrice ritornata dalla funzione imread
rgb = imread('RGB.png'); % La dimensione della matrice rgb si legge tramite il comando 'size' size(rgb)
Osserviamo separatamente i 3 piani di colore mostrandoli separatamento. Il comando 'figure' apre una nuova finestra grafica ogni volta che viene chiamato. Il carattere ';' funziona in questo caso da separatore tra comandi così che, per brevità, si scrivano 2 comandi ad ogni linea
figure; imshow(rgb(:,:,1)) figure; imshow(rgb(:,:,2)) figure; imshow(rgb(:,:,3))
Analizzate la notazione usata nell'espressione e ricordate la sintassi per la manipolazione di matrici di Octave/Matlab. Le 3 immagini sono a scala di grigi, infatti
size(rgb(:,:,1))
è una semplice immagine senza piani di colore. Quindi provate a riprodurre le 3 immagini fondamentali ma con il loro colore a partire da una nuova immagine 'rgb_nuova' avente tutti i 3 piani
Il comando seguente costruisce una matrice di zeri avente la stessa dimensione della matrice rgb e quindi assegna al canale rosso la matrice rgb(:,:,1), quindi viene mostrato l'immagine risultante
rgb_nuova = zeros(size(rgb)); figure; imshow(rgb_nuova); rgb_nuova(:,:,1) = rgb(:,:,1); imshow(rgb_nuova)
Cosa non va in questa immagine?
- Le dimensioni sono identiche perché così abbiamo costruito le matrici
- Il contenuto del primo piano di colore è stato assegnatoa partire dalla immagine originaria quindi deve essere identico
Tuttavia la rappresentazione delle 2 matrici non è la stessa. Osservate
l'output delle chiamate alla funzione class
per le due matrici
class(rgb) class(rgb_nuova)
riprovate a costruire rgb_nuova ma a partire da un'immagine rgb ricalcolata con la funzione mat2gray