L2 Elaborazione di immagini in C/C++ Corso di Visione Artificiale Ing. Luca Mazzei.

21
L2 Elaborazione di immagini in C/C++ Corso di Visione Artificiale Ing. Luca Mazzei

Transcript of L2 Elaborazione di immagini in C/C++ Corso di Visione Artificiale Ing. Luca Mazzei.

Page 1: L2 Elaborazione di immagini in C/C++ Corso di Visione Artificiale Ing. Luca Mazzei.

L2 Elaborazione di immagini in C/C++

Corso di Visione Artificiale

Ing. Luca Mazzei

Page 2: L2 Elaborazione di immagini in C/C++ Corso di Visione Artificiale Ing. Luca Mazzei.

2

AA 2009/2010 Visione Artificiale

Formato immagini

Utilizziamo il formato PGM PPM

P5320 240255@

P4 = PBMP5 = PGMP6 = PPM

Dimensioni Immagine

Informazioni aggiuntiveEs. TimeStamp,

velocita’(0,0) (0,1) … (319,239)(1,0)

Valore massimo del colore

PBM, PGM: 1 byte per pixelPPM: 3 byte per pixel

Page 3: L2 Elaborazione di immagini in C/C++ Corso di Visione Artificiale Ing. Luca Mazzei.

Visione Artificiale 3

Formato immagini

In memoria il bitmap è un vettore, buffer

Width lunghezza = numero di colonne

Height altezza = numero di righe

AA 2009/2010

(0,0)

(W,H)

i = 0 i = w-1

Page 4: L2 Elaborazione di immagini in C/C++ Corso di Visione Artificiale Ing. Luca Mazzei.

4

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 imagemagickimagemagick - image manipulation programs

www.imagemagick.org

AA 2009/2010 Visione Artificiale

Page 5: L2 Elaborazione di immagini in C/C++ Corso di Visione Artificiale Ing. Luca Mazzei.

5

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

Page 6: L2 Elaborazione di immagini in C/C++ Corso di Visione Artificiale Ing. Luca Mazzei.

6

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

Page 7: L2 Elaborazione di immagini in C/C++ Corso di Visione Artificiale Ing. Luca Mazzei.

Visione Artificiale 7

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 elementsstd::cout << "vector elements: ";for( int i = 0; i < v.size(); ++i ) { std::cout << v[i] << " ";}std::cout << std::endl;

AA 2009/2010

Page 8: L2 Elaborazione di immagini in C/C++ Corso di Visione Artificiale Ing. Luca Mazzei.

Visione Artificiale 8

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

Page 9: L2 Elaborazione di immagini in C/C++ Corso di Visione Artificiale Ing. Luca Mazzei.

Visione Artificiale 9

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

Page 10: L2 Elaborazione di immagini in C/C++ Corso di Visione Artificiale Ing. Luca Mazzei.

10

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

Page 11: L2 Elaborazione di immagini in C/C++ Corso di Visione Artificiale Ing. Luca Mazzei.

Visione Artificiale 11

Image.hstruct 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

Page 12: L2 Elaborazione di immagini in C/C++ Corso di Visione Artificiale Ing. Luca Mazzei.

12

Binarizzazione

Per ogni pixel confronto con una soglia

AA 2009/2010 Visione Artificiale

0 0 0 0 0

0 255 255 255 255

0 0 255 255 255

0 0 255 255 255

0 50 40 50 50

100 150 170 150 150

0 3 150 240 240

0 255 150 170 255

Page 13: L2 Elaborazione di immagini in C/C++ Corso di Visione Artificiale Ing. Luca Mazzei.

13

Istogramma

Scansionando tutto l’array dell’immagine per colonne (o righe) accumulo i valori in un vettore

AA 2009/2010 Visione Artificiale

0 50 40 50 50

100 150 170 150 150

0 3 150 240 240

0 255 150 170 255

Posso salvare i valori in un file e ottenere il grafico con Gnuplot…

3 0 0 1 0 0 1…

i = 0 i = 255

Page 14: L2 Elaborazione di immagini in C/C++ Corso di Visione Artificiale Ing. Luca Mazzei.

Visione Artificiale 14

Immagine Differenza

diff_img = img1 – img2 Differenza singoli pixel Differenza con sogliatura finale

AA 2009/2010

image – background = difference

Page 15: L2 Elaborazione di immagini in C/C++ Corso di Visione Artificiale Ing. Luca Mazzei.

Visione Artificiale 15

Ritaglio immagine Seleziono un’area di interesse

dell’immagine (Bounding Box) Nuovo buffer contenente il bounding box Dimensioni? Come gestire le coordinate?

AA 2009/2010

Page 16: L2 Elaborazione di immagini in C/C++ Corso di Visione Artificiale Ing. Luca Mazzei.

Visione Artificiale 16

Rilevamento bordi

Con operazioni locali, maschera nxn Maschera di Sobel

– Sobel orizzontale– Sobel verticale

Laplace? Prewitt roberts Estrazione bordi + binarizzazione

AA 2009/2010

-1 0 1

-2 0 2

-1 0 1

-1 -2 -1

0 0 0

1 2 1

-1 -1 -1

0 0 0

1 1 1

-1 -1 -1

0 0 0

1 1 1

Sobel verticale orizzontale Prewitt verticale orizzontale

1 0

0 -1

0 1

-1 0

Roberts

Page 17: L2 Elaborazione di immagini in C/C++ Corso di Visione Artificiale Ing. Luca Mazzei.

Visione Artificiale 17

Filtro convolutivo

Filtro mediano, operazione locale nxn

Efficienza in base alla maschera Utilizzo std::vector e algoritmo

std::sort

AA 2009/2010

165

163

163

168

170

170

169

167

164

168

Page 18: L2 Elaborazione di immagini in C/C++ Corso di Visione Artificiale Ing. Luca Mazzei.

Visione Artificiale 18

Etichettatura (Labelizzazione) Es. Sull’immagine differenza per

evidenziare i blob (aree dell’immagine differenza di forma indefinita)

AA 2009/2010

Page 19: L2 Elaborazione di immagini in C/C++ Corso di Visione Artificiale Ing. Luca Mazzei.

Visione Artificiale 19

Labelizzazione a macchia d’olio (floodfill)

AA 2009/2010

3,2

2,3

3,3

EspansioneControllo vicinato

vect

or<

punt

o>

pushpop1,2

Nuovo LabelL=L+1

push

L

Page 20: L2 Elaborazione di immagini in C/C++ Corso di Visione Artificiale Ing. Luca Mazzei.

20

Immagini a colori

Come è fatto il vettore bitmap? Impostazione doppio for? Sogliatura?

Rimane per casa…

AA 2009/2010 Visione Artificiale

Page 21: L2 Elaborazione di immagini in C/C++ Corso di Visione Artificiale Ing. Luca Mazzei.

Visione Artificiale 21

Assegnamento Per le immagini pgm:

– 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

Per le immagini a colori:– 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

AA 2009/2010