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.