11.1.3 Le immagini digitali

Un’immagine digitale, cioè la rappresentazione di un immagine sul computer, si compone di pixel che costituiscono le unità minime di informazione luminosa. Ogni pixel è rappresentato da un determinato numero di bit, dipendentemente dal numero di colori che questo può assumere. In particolare ogni pixel è rappresentato da un insieme di bit che indicano nell’ordine: l’intensità di rosso, quella di verde e quella di blu (RGB) che deve essere associata al relativo punto dell’immagine per poter essere rappresentato correttamente sullo schermo. Ad esempio supponendo di rappresentare ogni pixel con 12 bit, si avranno 4 bit per il rosso, 4 per il verde e 4 per il blu, quindi un pixel associato al colore 1011000011112 sarà rappresentato con un colore con componente rossa di intensità 10112, nesuna componente verde (00002) e componente blu massima (11112).


pict
Figura 11.3: Rappresentazione delle componenti di colore dei pixel.

Il numero di bit con il quale viene rappresentato ogni singolo pixel è anche detto profondità di colore dell’immagine, per cui il massimo numero di colori rappresentabili in tale immagine è dato da

nxmaxxcolori = 2nxbitxpixel

dove n_bit_pixel è il numero di bit utilizzati per la rappresentazione di ogni pixel dell’immagine. In questo modo si hanno immagini a 8 bit per pixel che possono contenere al massimo 28 = 256 colori, immagini con profondità di colore a 12 bit che possono contenere al massimo 212 = 4096 colori, immagini con profondità di colore a 16 bit che possono contenere al massimo 216 = 65536 colori (highcolor) ed immagini con profondità di colore a 24 bit che possono contenere al massimo 224 = 16777216 colori (truecolor).

I colori principali, secondo la codifica RGB, si ottengono per mezzo delle combinazioni espresse nella tab. 11.1.


Colore-|R---G---B-|
rosso--|-•--0---0-|
giallo  | •  •   0 |
verde  | 0  •   0 |
ciano  | 0  •   • |
bluviola   | 0•  00   •• |
-----------------

Tabella 11.1: Combinazioni dei colori principali nella rappresentazione RGB.

La rappresentazione dei colori nelle componenti RGB è soltanto una tra le rappresentazioni possibili. Un’altra rappresentazione utilizzata è quella HSV (Hue, Saturation, Value) ovvero tinta, saturazione e valore. La tinta è un valore che indica il colore principale come l’angolo in gradi (da 0 a 360) nella ruota dei colori (v. fig. 11.4), la saturazione indica la quantità di bianco presente nel colore (da 0 ad 1) ed il valore indica l’intensità di colore.


pict
Figura 11.4: La ruota dei colori.

11.1.3.1 La palette

Molte volte capitano situazioni in cui le immagini utilizzano soltanto una parte dei colori possibili relativamente alla profontità di colore con cui vengono realizzate. Ad esempio, lavorando con una profondità di colore a 24 bit è difficile, specialmente in un’immagine di dimensioni ridotte, che vengano utilizzati tutti i possibili colori all’interno dell’immagine stessa. In tal caso è possibile creare una palette (tavolozza) dei colori che sono effettivamente utilizzati nell’immagine e riferirsi a tale palette per la decodifica dei colori.

Ad esempio, una volta realizzata l’immagine, scegliendo i colori da tutti quelli possibili, si supponga che risulti che il primo pixel in alto a sinistra sia realizzato con il colore 3E01BFH, il secondo con il colore 442E0BH ed il resto dei pixel con il colore 000000H (nero). Si può pensare di memorizzare nel file relativo all’immagine, una palette composta soltanto dai colori utilizzati (3E01BFH, 442E0BH e 000000H) e di memorizzare per ogni pixel soltanto 2 bit (anziché 24 bit) che indicano la posizione del colore contenuto nella palette associato al pixel considerato (2 bit sono sufficienti a distinguere fino a 4 colori diversi). Dunque, il primo pixel, associato al colore 3E01BFH, si riferirà al primo colore presente nella palette (002), il secondo al secondo colore della palette (012) e gli altri al terzo colore (102). Così facendo si risparmiano un bel po’ di byte nella memorizzazione dell’immagine (22 bit per pixel) ma, oltre all’immagine si deve memorizzare anche la palette (i colori utilizzati). Comunque per immagini di medie e grandi dimensioni che fanno uso di pochi colori, il risparmio di byte è notevole.

[da completare ...]

11.1.3.2 La rappresentazione delle immagini

Quanto finora descritto, si riferisce alle immagini che vengono direttamente visualizzate sullo schermo, cioè si parla di una rappresentazione dell’immagine di tipo bitmap o raster. Questo significa che ogni pixel che compone l’immagine viene rappresentato per mezzo di uno o più bit. Se però successivamente si applicano particolari operazioni all’immagine, la sua qualità ne può risultare alterata. Ad esempio, si supponga di aver rappresentato un’immagine in maniera raster, cioè memorizzando ogni pixel che la compone. Se successivamente si opera un ingrandimento dell’immagine al 200%, da ogni pixel se ne generano 4, ottenendo così lo sgranamento dell’immagine iniziale, cioè si delineano sempre più i singoli pixel: un po’ quello che accade, ad esempio, ingrandendo notevolmente l’immagine di una fotografia.


pict
Figura 11.5: Differenza tra un’immagine vettoriale ed una raster.

Esiste anche un altro metodo per la rappresentazione delle immagini, in maniera tale che eventuali successivi ingrandimenti non producano sgranature dell’immagine stessa: le immagini di tipo vettoriale (vector graphics). Questo è possibile se anziché rappresentare un’immagine per mezzo della memorizzazione di ogni singolo pixel che la compone, la si rappresenta memorizzando ogni curva, cerchio, rettangolo, ... di cui è composta l’immagine. Ciò rende l’immagine indipendente dalla dimensione della stessa. Infatti non si ha la necessità di definire a priori la dimensione dell’immagine, ma la si può pensare come il risultato delle operazioni necessarie per realizzarla. Ad esempio, piuttosto che memorizzare un insieme di pixel contigui dello stesso colore, si può memorizzare il fatto che essi sono il risultato del disegno di un segmento di un certo colore che inizia e termina a determinate coordinate (relative)1. Il visualizzatore di immagini, interpretando le indicazioni presenti nella rappresentazione dell’immagine stessa, la visualizza sullo schermo ricostruendola di volta in volta, cioè, in gergo tecnico, la rasterizza, ovvero riproduce una versione raster della stessa per poter essere visualizzata.2

Un’applicazione libera molto utilizzata per il trattamento di immagini raster è GIMP3, mentre un applicazioni libere per la gestione di immagini vettoriali sono Sodipodi e Inkscape4. Dalla fig. 11.5, che riporta un’immagine vettoriale sovrapposta ad una raster, si può facilmente capire la differenza tra le due: la zona relativa all’occhio, ad esempio, come quella della bocca, essendo riprodotte con grafica vettoriale non subiscono sgranature durante l’ingrandimento (le sgranature visibili sono quelle dell’immagine raster sottostante), come invece accade per i peli della barba.