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