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;
}
http://answers.opencv.org/question/7385/how-to-calculate -wartość-średnia-z-wielu-zdjęć/ –
Nie jestem pewien, czy poprawnie zrozumiałem twoje pytanie w mojej odpowiedzi, czy mógłbyś powiedzieć, czy mam to poprawnie? – kebs
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ń –