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

  1. Come octave rappresenta internamente un'immagine a colori
  2. Realizzare la corrispondenza tra sorgenti e piani di colore
  3. 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