La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

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

Presentazioni simili


Presentazione sul tema: "L2 Elaborazione di immagini in C/C++ Corso di Visione Artificiale Ing. Luca Mazzei."— Transcript della presentazione:

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

2 … AA 2009/2010 Visione Artificiale 2 Formato immagini n Utilizziamo il formato PGM PPM P5 320 240 255@ P4 = PBM P5 = PGM P6 = PPM Dimensioni Immagine Informazioni aggiuntive Es. TimeStamp, velocita (0,0)(0,1) … (319,239)(1,0) Valore massimo del colore PBM, PGM: 1 byte per pixel PPM: 3 byte per pixel

3 Formato immagini n In memoria il bitmap è un vettore, buffer n Width lunghezza = numero di colonne n Height altezza = numero di righe AA 2009/2010 Visione Artificiale 3 (0,0) (W,H) … i = 0 i = w-1

4 Conversione immagini n Suite Imagemagick: convert n.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

5 Impostazione algoritmo n Immagine input ed immagine appoggio, 2 buffer Buffer di unsigned char, p(x,y) [0, 255] Buffer di unsigned char, p(x,y) [0, 255] n Doppio for scansione buffer immagine n 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 for(unsigned int ii = 0; ii < width ; ++ii){ //scorre colonne if(input_buffer[(jj*width)+ii] > 70) { if(input_buffer[(jj*width)+ii] > 70) { output_buffer [(jj*width)+ii] = 255; output_buffer [(jj*width)+ii] = 255; } else else output_buffer [(jj*width)+ii] = 0; output_buffer [(jj*width)+ii] = 0; } }} AA 2009/2010 Visione Artificiale 5

6 Librerie STL (Standard Template Library) n Libreria standard basata su template n Riferimenti www.cppreference.com www.cplusplus.com www.cppreference.com www.cplusplus.comwww.cppreference.com www.cplusplus.com n Contenitori, iteratori ed algoritmi n Utile per operazioni su strutture dati non presenti nel C++ base AA 2009/2010 Visione Artificiale 6

7 Librerie STL (Standard Template Library) n Contenitori: vector, list, map, stack … // create a vector of random integers #include #include std::vector v; for( int i = 0; i < 10; ++i ) { int num = (int) rand() % 10; int num = (int) rand() % 10; v.push_back( num ); v.push_back( num ); } // print elements std::cout << "vector elements: "; for( int i = 0; i < v.size(); ++i ) { std::cout << v[i] << " "; std::cout << v[i] << " ";} std::cout << std::endl; AA 2009/2010 Visione Artificiale 7

8 Librerie STL (Standard Template Library) n Iterators – Puntatori ad elementi di un container – forward, bidirectional, random access std::vector v1(3, 5); for(std::vector ::iterator it = v1.begin(); it != v1.end(); ++it){ std::cout << *it << std::endl; std::cout << *it << std::endl;} AA 2009/2010 Visione Artificiale 8

9 Librerie STL (Standard Template Library) n Algorithm – Min, max, swap, count, sort #include #include std::vector v; v.push_back( 23 ); v.push_back( 23 ); v.push_back( -1 ); v.push_back( -1 ); v.push_back( 9999 ); v.push_back( 9999 ); v.push_back( 0 ); v.push_back( 0 ); v.push_back( 4 ); v.push_back( 4 ); std::cout << "Before sorting: "; std::cout << "Before sorting: "; for( unsigned int i = 0; i < v.size(); i++ ) { for( unsigned int i = 0; i < v.size(); i++ ) { std::cout << v[i] << " "; std::cout << v[i] << " "; } std::cout << std::endl; std::cout << std::endl; sort( v.begin(), v.end() ); sort( v.begin(), v.end() ); std::cout << "After sorting: "; std::cout << "After sorting: "; for( unsigned int i = 0; i < v.size(); i++ ) { for( unsigned int i = 0; i < v.size(); i++ ) { std::cout << v[i] << " "; std::cout << v[i] << " "; } std::cout << std::endl; std::cout << std::endl; AA 2009/2010 Visione Artificiale 9

10 Strumenti a disposizione per programmare – Image.h – main.cpp – main_color.cpp n (usare solo dopo aver provato a farla) – main_color2grey.cpp – Esempi STL AA 2009/2010 Visione Artificiale 10

11 Image.h struct Image { /// geometry /// geometry unsigned int width, height; unsigned int width, height; /// bit per pixel (8 is greyscale, 24 is rgb color) /// bit per pixel (8 is greyscale, 24 is rgb color) unsigned int bpp; unsigned int bpp; /// the bitmap /// the bitmap unsigned char *buffer; unsigned char *buffer; public: public: Image(); Image(); ~Image(); ~Image(); /// Allocate the inner buffer /// Allocate the inner buffer /// @param width,height the image geometry /// @param width,height the image geometry /// @param bpp Bit Per Pixel (8 grey, 24 color rgb) /// @param bpp Bit Per Pixel (8 grey, 24 color rgb) void Build(unsigned int width, unsigned int height, unsigned int bpp); void Build(unsigned int width, unsigned int height, unsigned int bpp); /// Save the image on @a filename /// Save the image on @a filename bool Save(const char *filename) const; bool Save(const char *filename) const; /// Load the image from @a filename /// Load the image from @a filename /// and initialize with,height,bpp and buffer field of struct /// and initialize with,height,bpp and buffer field of struct bool Load(const char *filename); }; bool Load(const char *filename); }; AA 2009/2010 Visione Artificiale 11

12 Binarizzazione n Per ogni pixel confronto con una soglia AA 2009/2010 Visione Artificiale 12 00000 0255 00 00 0504050 100150170150 03 240 0255150170255

13 Istogramma n Scansionando tutto larray dellimmagine per colonne (o righe) accumulo i valori in un vettore AA 2009/2010 Visione Artificiale 13 0504050 100150170150 03 240 0255150170255 Posso salvare i valori in un file e ottenere il grafico con Gnuplot… 3001 001 … i = 0 i = 255

14 Immagine Differenza n diff_img = img1 – img2 n Differenza singoli pixel n Differenza con sogliatura finale AA 2009/2010 Visione Artificiale 14 image – background = difference

15 Ritaglio immagine n Seleziono unarea di interesse dellimmagine (Bounding Box) n Nuovo buffer contenente il bounding box n Dimensioni? n Come gestire le coordinate? AA 2009/2010 Visione Artificiale 15

16 Rilevamento bordi n Con operazioni locali, maschera nxn n Maschera di Sobel – Sobel orizzontale – Sobel verticale n Laplace? Prewitt roberts n Estrazione bordi + binarizzazione AA 2009/2010 Visione Artificiale 16 01 -202 01 -2 000 121 000 111 000 111 Sobel verticale orizzontale Prewitt verticale orizzontale 10 0 01 0 Roberts

17 Filtro convolutivo n Filtro mediano, operazione locale nxn n Efficienza in base alla maschera n Utilizzo std::vector e algoritmo std::sort AA 2009/2010 Visione Artificiale 17 165163 168170 169167164 168

18 Etichettatura (Labelizzazione) n Es. Sullimmagine differenza per evidenziare i blob (aree dellimmagine differenza di forma indefinita) AA 2009/2010 Visione Artificiale 18

19 Labelizzazione a macchia dolio (floodfill) AA 2009/2010 Visione Artificiale 19 3,2 2,3 3,3 Espansione Controllo vicinato vector push pop 1,2 Nuovo Label L=L+1 push … L

20 Immagini a colori n Come è fatto il vettore bitmap? n Impostazione doppio for? n Sogliatura? n Rimane per casa… AA 2009/2010 Visione Artificiale 20

21 Assegnamento n Per le immagini pgm: – Copia dellimmagine – Istogramma – Sogliatura, binarizzazione – Abbassamento luminosita – Filtro mediano – Estrazione dei contorni – Differenza tra immagini – Ritaglio di una porzione dellimmagine – Labellizzazione a macchia dolio n Per le immagini a colori: – Copia dellimmagine – 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 dellimmagine AA 2009/2010 Visione Artificiale 21


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

Presentazioni simili


Annunci Google