2016-02-27 22 views
5

ho 100 immagini, ognuna è 598 * 598 pixel, e voglio rimuovere il pittorico e il rumore prendendo la media dei pixel, ma se voglio usare l'aggiunta per "pixel per pixel", poi dividendo scriverò un loop fino a 596 * 598 ripetizioni per un'immagine e 598 * 598 * 100 per centinaia di immagini.Come posso prendere la media di 100 immagini usando opencv?

c'è un metodo per aiutarmi in questa operazione?

+0

http://answers.opencv.org/question/7385/how-to-calculate -il-valore-medio-di-immagini multiple/ –

+0

Non sono sicuro di aver capito correttamente la tua domanda nella mia risposta, potresti per favore commentare se ho capito bene? – kebs

+0

voglio prendere la media di 100 immagine, il mio problema: se prendo la media aggiungendo ogni pixel, il mio ciclo farà 598 * 598 * 100 = 25000000 ripetizione –

risposta

2

Hai bisogno di un ciclo su ogni immagine, e si accumulano i risultati. Poiché è probabile che ciò causi un overflow, è possibile convertire ciascuna immagine in un'immagine CV_64FC3 e accumularsi su un'immagine CV_64FC3. È possibile utilizzare anche CV_32FC3 o CV_32SC3 per questo, vale a dire utilizzando float o integer anziché double.

volta accumulati tutti i valori, è possibile utilizzare sia convertTo:

  • rendere l'immagine un divario CV_8UC3
  • ogni valore per il numero di immagini, per ottenere la media effettiva.

Questo è un esempio di codice che crea 100 immagini casuali, e calcola e mostra l' medio:

#include <opencv2\opencv.hpp> 
using namespace cv; 

Mat3b getMean(const vector<Mat3b>& images) 
{ 
    if (images.empty()) return Mat3b(); 

    // Create a 0 initialized image to use as accumulator 
    Mat m(images[0].rows, images[0].cols, CV_64FC3); 
    m.setTo(Scalar(0,0,0,0)); 

    // Use a temp image to hold the conversion of each input image to CV_64FC3 
    // This will be allocated just the first time, since all your images have 
    // the same size. 
    Mat temp; 
    for (int i = 0; i < images.size(); ++i) 
    { 
     // Convert the input images to CV_64FC3 ... 
     images[i].convertTo(temp, CV_64FC3); 

     // ... so you can accumulate 
     m += temp; 
    } 

    // Convert back to CV_8UC3 type, applying the division to get the actual mean 
    m.convertTo(m, CV_8U, 1./images.size()); 
    return m; 
} 

int main() 
{ 
    // Create a vector of 100 random images 
    vector<Mat3b> images; 
    for (int i = 0; i < 100; ++i) 
    { 
     Mat3b img(598, 598); 
     randu(img, Scalar(0), Scalar(256)); 

     images.push_back(img); 
    } 

    // Compute the mean 
    Mat3b meanImage = getMean(images); 

    // Show result 
    imshow("Mean image", meanImage); 
    waitKey(); 

    return 0; 
} 
1

Innanzitutto, converti le immagini in float. Hai N = 100 immagini. Immagina che una singola immagine sia una matrice di valori medi di pixel di 1 immagine. È necessario calcolare un array di valori medi di pixel di immagini N.

Let A - array di valori medi dei pixel di X immagini, B - array di valori medi dei pixel di Y immagini. Quindi C = (A * X + B * Y)/(X + Y) - matrice di valori medi di pixel delle immagini X + Y. Per ottenere una maggiore precisione nelle operazioni in virgola mobile X e Y dovrebbe essere approssimativamente uguale

È possibile unire tutte le immagini come subarray in merge sort. In te operazione di unione caso è C = (A * X + B * Y)/(X + Y) dove A e B sono matrici di valori medi dei pixel di X e Y immagini

Problemi correlati