2016-02-27 12 views
5

Mam 100 obrazów, każdy z nich ma 598 * 598 pikseli, a chcę usunąć obraz i szum, biorąc średnią pikseli, ale jeśli chcę użyć Dodawanie dla "piksel po pikselu", to dzieląc się napiszę pętla do 596 * 598 powtórzeń dla jednego obrazu i 598 * 598 * 100 dla setki zdjęć.Jak mogę pobrać średnio 100 obrazów za pomocą opencv?

Czy istnieje metoda, która pomoże mi w tej operacji?

+0

http://answers.opencv.org/question/7385/how-to-calculate -wartość-średnia-z-wielu-zdjęć/ –

+0

Nie jestem pewien, czy poprawnie zrozumiałem twoje pytanie w mojej odpowiedzi, czy mógłbyś powiedzieć, czy mam to poprawnie? – kebs

+0

Chcę wziąć w średnim 100 obraz, mój problem: jeśli biorę średnią dodając każdy piksel, moja pętla zrobi 598 * 598 * 100 = 25000000 powtórzeń –

Odpowiedz

2

Trzeba pętli na każdym obrazie, i gromadzić wyniki. Ponieważ może to spowodować przepełnienie, możesz przekonwertować każdy obraz na obraz CV_64FC3 i uzyskać obraz CV_64FC3. Można również użyć do tego celu CV_32FC3 lub CV_32SC3, tj. Przy użyciu float lubzamiast double.

Po zgromadzeniu wszystkich wartości, można użyć zarówno do convertTo:

  • sprawiają, że obraz, jaki CV_8UC3
  • podzielić każdą wartość przez liczbę obrazek, aby uzyskać rzeczywistą średnią.

To jest przykładowy kod, który tworzy 100 losowych obrazów i oblicza i pokazuje myśli:

#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

Najpierw konwertuj obrazy na pływaki. Masz N = 100 obrazów. Wyobraź sobie, że pojedynczy obraz jest tablicą średniej wartości pikseli 1 obrazu. Musisz obliczyć tablicę średnich wartości pikseli N obrazów.

Niech A - tablica wartości średniego piksela X obrazów, B - tablica średnich wartości pikseli obrazów Y. Następnie C = (A * X + B * Y)/(X + Y) - tablica średnich wartości pikseli z obrazów X + Y. Aby uzyskać lepszą dokładność w operacjach zmiennoprzecinkowych, operacje X i powinny być w przybliżeniu równe

Możesz scalić wszystkie obrazy, takie jak podmary w merge sort. W was sprawa operacja scalania C = (A * X + B * Y)/(X + Y) gdzie A i B są tablice średnich wartości pikseli X i Y obrazów

Powiązane problemy