L2 Elaborazione di immagini
in C/C++
Corso di Visione Artificiale
Ing. Luca Mazzei
Formato immagini

Utilizziamo il formato PGM PPM
P4 = PBM
P5 = PGM
P6 = PPM
(0,0)
Dimensioni Immagine
P5
320 240
255
@
(0,1)
…
Valore massimo del colore
Informazioni aggiuntive
Es. TimeStamp, velocita’
(1,0)
…
(319,239)
PBM, PGM: 1 byte per pixel
PPM:
3 byte per pixel
AA 2009/2010
Visione Artificiale
2
Formato immagini
In memoria il bitmap è un vettore, buffer
 Width lunghezza = numero di colonne
 Height altezza = numero di righe

(0,0)
…
i=0
i = w-1
(W,H)
AA 2009/2010
Visione Artificiale
3
Conversione immagini
Suite Imagemagick: convert
 .jpg .ppm .pgm .png .bmp

convert input_img.xxx output_img.xxx
(con ubuntu)
root@mio_pc:~# apt-cache search imagemagick
imagemagick - image manipulation programs
www.imagemagick.org
AA 2009/2010
Visione Artificiale
4
Impostazione algoritmo
Immagine input ed immagine appoggio, 2 buffer
Buffer di unsigned char, p(x,y) ∊ [0, 255]
 Doppio for scansione buffer immagine
 Scansione per righe -> adiacenze in memoria


for(unsigned int jj = 0; jj < height ; ++jj){ //scorre righe
for(unsigned int ii = 0; ii < width ; ++ii){ //scorre colonne
if(input_buffer[(jj*width)+ii] > 70) {
output_buffer [(jj*width)+ii] = 255;
}
else
output_buffer [(jj*width)+ii] = 0;
}
}
}
AA 2009/2010
Visione Artificiale
5
Librerie STL (Standard Template Library)
Libreria standard basata su template
 Riferimenti www.cppreference.com
www.cplusplus.com
 Contenitori, iteratori ed algoritmi
 Utile per operazioni su strutture dati
non presenti nel C++ base

AA 2009/2010
Visione Artificiale
6
Librerie STL (Standard Template Library)

Contenitori: vector, list, map, stack …
// create a vector of random integers
#include <vector>
std::vector<int> v;
for( int i = 0; i < 10; ++i ) {
int num = (int) rand() % 10;
v.push_back( num );
}
// print elements
std::cout << "vector elements: ";
for( int i = 0; i < v.size(); ++i ) {
std::cout << v[i] << " ";
}
std::cout << std::endl;
AA 2009/2010
Visione Artificiale
7
Librerie STL (Standard Template Library)

Iterators
Puntatori ad elementi di un container
– forward, bidirectional, random access
–
std::vector<int> v1(3, 5);
for(std::vector<int>::iterator it = v1.begin(); it != v1.end(); ++it){
std::cout << *it << std::endl;
}
AA 2009/2010
Visione Artificiale
8
Librerie STL (Standard Template Library)

Algorithm
– Min, max, swap, count, sort
#include <algorithm>
#include <vector>
std::vector<int> v;
v.push_back( 23 );
v.push_back( -1 );
v.push_back( 9999 );
v.push_back( 0 );
v.push_back( 4 );
std::cout << "Before sorting: ";
for( unsigned int i = 0; i < v.size(); i++ ) {
std::cout << v[i] << " ";
}
std::cout << std::endl;
sort( v.begin(), v.end() );
std::cout << "After sorting: ";
for( unsigned int i = 0; i < v.size(); i++ ) {
std::cout << v[i] << " ";
}
std::cout << std::endl;
AA 2009/2010
Visione Artificiale
9
Strumenti a disposizione per programmare
Image.h
– main.cpp
– main_color.cpp
–
 (usare
solo dopo aver provato a farla)
main_color2grey.cpp
– Esempi STL
–
AA 2009/2010
Visione Artificiale
10
Image.h
struct Image {
/// geometry
unsigned int width, height;
/// bit per pixel (8 is greyscale, 24 is rgb color)
unsigned int bpp;
/// the bitmap
unsigned char *buffer;
public:
Image();
~Image();
/// Allocate the inner buffer
/// @param width,height the image geometry
/// @param bpp Bit Per Pixel (8 grey, 24 color rgb)
void Build(unsigned int width, unsigned int height, unsigned int bpp);
/// Save the image on @a filename
bool Save(const char *filename) const;
/// Load the image from @a filename
/// and initialize with,height,bpp and buffer field of struct
bool Load(const char *filename); };
AA 2009/2010
Visione Artificiale
11
Binarizzazione

AA 2009/2010
Per ogni pixel confronto con una soglia
0
50
40
50
50
0
0
0
0
0
100
150
170
150
150
0
255
255
255
255
0
3
150
240
240
0
0
255
255
255
0
255
150
170
255
0
0
255
255
255
Visione Artificiale
12
Istogramma

Scansionando tutto l’array
dell’immagine per colonne (o righe)
accumulo i valori in un vettore
0
50
40
50
50
100
150
170
150
150
0
3
150
240
240
0
255
150
170
255
3
0
0
1
…
0
i=0
0
1
i = 255
Posso salvare i valori in un file e ottenere il grafico con Gnuplot…
AA 2009/2010
Visione Artificiale
13
Immagine Differenza
diff_img = img1 – img2
 Differenza singoli pixel
 Differenza con sogliatura finale

image
AA 2009/2010
–
background
=
Visione Artificiale
difference
14
Ritaglio immagine




AA 2009/2010
Seleziono un’area di interesse
dell’immagine (Bounding Box)
Nuovo buffer contenente il bounding box
Dimensioni?
Come gestire le coordinate?
Visione Artificiale
15
Rilevamento bordi
Con operazioni locali, maschera nxn
 Maschera di Sobel

–
–


Sobel orizzontale
Sobel verticale
Laplace? Prewitt roberts
Estrazione bordi + binarizzazione
-1
0
1
-1
-2
-1
-1
-1
-1
-1
-1
-1
1
0
0
1
-2
0
2
0
0
0
0
0
0
0
0
0
0
-1
-1
0
-1
0
1
1
2
1
1
1
1
1
1
1
Sobel verticale orizzontale
AA 2009/2010
Roberts
Prewitt verticale orizzontale
Visione Artificiale
16
Filtro convolutivo
Filtro mediano, operazione locale nxn
 Efficienza in base alla maschera
 Utilizzo std::vector e algoritmo std::sort

165
163
163
168
170
170
169
167
164
168
AA 2009/2010
Visione Artificiale
17
Etichettatura (Labelizzazione)

AA 2009/2010
Es. Sull’immagine differenza per
evidenziare i blob (aree dell’immagine
differenza di forma indefinita)
Visione Artificiale
18
Labelizzazione a macchia d’olio (floodfill)
L
vector<punto>
Nuovo Label
L=L+1
push
AA 2009/2010
1,2
Espansione
pop
3,2
Controllo
vicinato
push
2,3
3,3
…
Visione Artificiale
19
Immagini a colori
Come è fatto il vettore bitmap?
 Impostazione doppio for?
 Sogliatura?


AA 2009/2010
Rimane per casa…
Visione Artificiale
20
Assegnamento

Per le immagini pgm:
–
–
–
–
–
–
–
–
–

Per le immagini a colori:
–
–
–
–
–
–
–
–
AA 2009/2010
Copia dell’immagine
Istogramma
Sogliatura, binarizzazione
Abbassamento luminosita’
Filtro mediano
Estrazione dei contorni
Differenza tra immagini
Ritaglio di una porzione dell’immagine
Labellizzazione a macchia d’olio
Copia dell’immagine
Istogramma per ogni valore del pixel RGB
Sogliatura, binarizzazione
Abbassamento luminosita’
Filtro mediano sui tre canali
Estrazione dei contorni
Differenza tra immagini
Ritaglio di una porzione dell’immagine
Visione Artificiale
21
Scarica

L2_Elaborazione_Immagini