L2 Elaborazione di immagini in C/C++ Corso di Visione Artificiale Ing. Luca Mazzei
Formato immagini Utilizziamo il formato PGM PPM P5 320 240 255 @ Dimensioni Immagine P4 = PBM P5 = PGM P6 = PPM Valore massimo del colore Informazioni aggiuntive Es. TimeStamp, velocita’ (0,0) (0,1) … (1,0) … (319,239) PBM, PGM: 1 byte per pixel PPM: 3 byte per pixel AA 2009/2010 Visione Artificiale
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
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
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
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
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
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
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: "; AA 2009/2010 Visione Artificiale
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
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
Binarizzazione Per ogni pixel confronto con una soglia 50 40 100 150 50 40 100 150 170 3 240 255 255 AA 2009/2010 Visione Artificiale
Posso salvare i valori in un file e ottenere il grafico con Gnuplot… Istogramma Scansionando tutto l’array dell’immagine per colonne (o righe) accumulo i valori in un vettore 50 40 100 150 170 3 240 255 3 1 … 1 i = 0 i = 255 Posso salvare i valori in un file e ottenere il grafico con Gnuplot… AA 2009/2010 Visione Artificiale
image – background = difference Immagine Differenza diff_img = img1 – img2 Differenza singoli pixel Differenza con sogliatura finale image – background = difference AA 2009/2010 Visione Artificiale
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 Visione Artificiale
Rilevamento bordi Con operazioni locali, maschera nxn Maschera di Sobel Sobel orizzontale Sobel verticale Laplace? Prewitt roberts Estrazione bordi + binarizzazione -1 1 -2 2 -1 -2 1 2 -1 1 -1 1 1 -1 1 -1 Roberts Sobel verticale orizzontale Prewitt verticale orizzontale AA 2009/2010 Visione Artificiale
Filtro convolutivo Filtro mediano, operazione locale nxn Efficienza in base alla maschera Utilizzo std::vector e algoritmo std::sort 165 163 168 170 169 167 164 168 AA 2009/2010 Visione Artificiale
Etichettatura (Labelizzazione) Es. Sull’immagine differenza per evidenziare i blob (aree dell’immagine differenza di forma indefinita) AA 2009/2010 Visione Artificiale
Labelizzazione a macchia d’olio (floodfill) Nuovo Label L=L+1 Espansione push Controllo vicinato pop push 1,2 3,2 2,3 3,3 … vector<punto> AA 2009/2010 Visione Artificiale
Immagini a colori Come è fatto il vettore bitmap? Impostazione doppio for? Sogliatura? Rimane per casa… AA 2009/2010 Visione Artificiale
Assegnamento Per le immagini pgm: Per le immagini a colori: 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: Istogramma per ogni valore del pixel RGB Filtro mediano sui tre canali AA 2009/2010 Visione Artificiale