2016-02-27 9 views
5

Ich habe 100 Bild, jedes ist 598 * 598 Pixel, und ich möchte das Bild und Rauschen entfernen, indem Sie den Durchschnitt der Pixel, aber wenn ich Addieren für "Pixel für Pixel" verwenden will, dann werde ich eine schreiben Schleife bis zu 596 * 598 Wiederholungen für ein Bild und 598 * 598 * 100 für hundert Bilder.Wie kann ich den Durchschnitt von 100 Bildern mit Opencv nehmen?

Gibt es eine Methode, die mir bei diesem Vorgang hilft?

+0

http://answers.opencv.org/question/7385/how-to-calculate - der Mittelwert von mehreren Bildern/ –

+0

Ich bin mir nicht sicher, ob ich deine Frage in meiner Antwort richtig verstanden habe, könntest du bitte kommentieren, wenn ich sie richtig verstanden habe? – kebs

+0

Ich möchte den Mittelwert von 100 Bild nehmen, mein Problem: Wenn ich den Mittelwert durch Hinzufügen jedes Pixels nehme, wird meine Schleife tun 598 * 598 * 100 = 25000000 Wiederholung –

Antwort

2

Sie müssen über jedes Bild in einer Schleife, und die Ergebnisse akkumulieren. Da dies wahrscheinlich zu Überlauf führt, können Sie jedes Bild in ein CV_64FC3 Bild konvertieren und auf einem CV_64FC3 Bild akkumulieren. Sie können dafür auch CV_32FC3 oder CV_32SC3 verwenden, d. H. Unter Verwendung von float oder integer anstelle von double.

Sobald Sie alle Werte angesammelt haben, können Sie convertTo verwenden beide:

  • das Bild eine durch die Anzahl der Bild CV_8UC3
  • divide jeden Wert machen, die tatsächliche Mittelwert zu erhalten.

Dies ist ein Beispielcode, der 100 zufällige Bilder, und berechnet und zeigt die Mittelwert erzeugt:

#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

Erstens - Bilder in Floats konvertieren. Sie haben N = 100 Bilder. Stellen Sie sich vor, dass ein einzelnes Bild ein Array von durchschnittlichen Pixelwerten von 1 Bild ist. Sie müssen ein Array von durchschnittlichen Pixelwerten von N Bildern berechnen.

Lassen A - Array der durchschnittlichen Pixelwerte von X Bilder, B - Array der durchschnittlichen Pixelwerte von Y Bilder. Dann C = (A * X + B * Y)/(X + Y) - Array von durchschnittlichen Pixelwerten von X + Y Bilder. Um eine bessere Genauigkeit bei Fließkommaoperationen zu erhalten, sollten X und Y ungefähr gleich sein.

Sie können alle Ihre Bilder wie Subarrays in merge sort zusammenführen. In Ihrem Fall Mischoperation ist C = (A * X + B * Y)/(X + Y) wo A und B sind Arrays der mittleren Pixelwerte von X und Y Bilder