Trasformazione di Immagini Grayscale
La funzione di octave che converte un'immagine a colori ad una
in scala di grigi è
rgb2gray
la quale accetta un immagine in formato double
, uint8
oppure uint16
.
% % Questa linea va eseguita solo con Octave % >> pkg load image % il file viene caricato in memoria nella matrice 'rice' >> rice=imread('rice-small.png'); % la dimensione del file >> size(rice) ans = 236 180 3 % rgb2gray converte l'immagine RGB in un'immagine grayscale >> ricegray=rgb2gray(rice); >> whos Variables in the current scope: Attr Name Size Bytes Class ==== ==== ==== ===== ===== rice 256x192x3 147456 uint8 ricegray 256x192 49152 uint8 Total is 196678 elements using 197371 bytes >> subplot(1,2,1) >> imshow(rice) >> subplot(1,2,2) >> imshow(ricegray)
Il comando subplot
suddivide la finestra grafica in
una griglia di num_righe x num_colonne
ha la forma subplot(num_righe,num_colonne,indice)
dove indice
è un numero intero compreso tra 1 e il numero di riquadri della grigli di suddivisione
La sequenza di comandi produce le immagini
mat2gray
La funzione
mat2gray
trasforma una matrice in una nuova dove i singoli elementi vengono ricalcolati in
una matrice internamente in formato double
e normalizzati
all'interno dell'intervallo [0..1].
Per rendere l'idea prendiamo una matrice 3x3 come esempio (in generale gli elementi possono essere anche negativi)
>> mt = [1.5 2 3.9; 3.2 -2 0; 2 0.5 1] mt = 1.50000 2.00000 3.90000 3.20000 -2.00000 0.00000 2.00000 0.50000 1.00000 >> gray = mat2gray(mt) ans = 0.59322 0.67797 1.00000 0.88136 0.00000 0.33898 0.67797 0.42373 0.50847
Cioè una matrice dove l'elemento massimo (3.9) viene posto a 1 e l'elemento minimo (-2.0) a 0. La quantità conservata in questa operazione è il rapporto tra distanza di un valore e il valore minimo nella matrice rispetto differenze tra massimo e minimo. Infatti
>> (mt - min(min(mt)))/(max(max(mt))-min(min(mt))) ans = 0.59322 0.67797 1.00000 0.88136 0.00000 0.33898 0.67797 0.42373 0.50847
è proprio la matrice calcolata da mat2gray. Riprendete allora
l'esercizio sul plotting
di una superficie e ricalcolate la superficie a sombrero
in una variabile
>> x=linspace(-1,1,500); >> y=x; >> [xx,yy]=meshgrid(x,y); >> z=(xx.*xx + yy.*yy); >> d=0.5; >> omega=2; >> somb=exp(-z/d).*cos(2*pi*omega*z); >> sombimg=mat2gray(somb); >> imshow(sombimg)
L'immagine così generata riproduce la superficie assegnando pixel più
luminosi ai valori della matrice che più si avvicinano ad 1
. A dispetto del nome
mat2gray
non converte la matrice che rappresenta un'immagine
in formato RGB in una matrice grayscale. Se ad essa viene passata un
immagine NxMx3 la funzione calcola la normalizzazione nell'intervallo [0..1]
per ciascuno dei 3 canali indipendentemente. Questo mantiene i rapporti
tra i valori delle componenti di colore, ma produce un immagine con identico
aspetto convertita in double
e con valori normalizzati. Se
la matrice ha un canale di trasparenza (cioè NxMx4) dipende dal range di
valori usati per esso. Un canale di trasparenza binario, come quello usato nelle
immagini in formato GIF, avendo solo valori booleani 0,1 rimane invariato
mat2gray
ammette un secondo argomento per specificare il range
di valori che devono essere considerati per la normalizzazione, saturando al
valore massimo e minimo i valori esterni agli estremi.