我如何使用opencv获取100个图像的平均值?

Kar*_*dan 8 c++ opencv average add

我有100个图像,每个是598*598像素,我想通过取像素的平均值去除图形和噪声,但如果我想使用"逐像素"添加,那么分割i将写入一个循环,直到一个图像重复596*598,一百个图像重复598*598*100.

有没有办法帮助我进行这项操作?

Mik*_*iki 5

您需要遍历每个图像,并累积结果。由于这样容易造成溢出,可以将每张图片转成一张CV_64FC3图片,在一张CV_64FC3图片上进行累加。您还可以使用CV_32FC3CV_32SC3对于这一点,即使用floatinteger代替double

累积所有值后,您可以同时使用convertTo

  • 使图像成为 CV_8UC3
  • 将每个值除以图像数量,以获得实际平均值。

这是创建 100 张随机图像并计算并显示平均值的示例代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)