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

时间:2016-02-27 09:30:32

标签: c++ opencv add average

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

有没有一种方法可以帮助我进行这项操作?

3 个答案:

答案 0 :(得分:4)

您需要遍历每个图像,并累积结果。由于这可能会导致溢出,因此您可以将每张图片转换为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;
}

答案 1 :(得分:1)

首先 - 将图像转换为浮点数。你有N = 100张图像。想象一下,单个图像是1个图像的平均像素值的数组。您需要计算N个图像的平均像素值数组。

A - X图像的平均像素值数组B - Y图像的平均像素值数组。然后C = (A * X + B * Y) / (X + Y) - X + Y图像的平均像素值数组。为了在浮点运算中获得更好的准确性,XY应该大致相等

您可以在merge sort中合并所有图像,例如子阵列。在您的情况下,合并操作为C = (A * X + B * Y) / (X + Y),其中ABXY图像的平均像素值数组

答案 2 :(得分:-1)

假定图像将不需要进行转换(伽玛,色彩空间或对齐方式)。 numpy软件包使您可以快速简洁地执行此操作。

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form class="form-inline my-2 my-lg-0">
  <input class="form-control mr-sm-2" id="123" type="search" placeholder="Search" aria-label="Search">
  <button type="button" class="btn btn-outline-dark" id="456" onclick="thisFunction()">Search</button>
</form>

这将自动促进元素浮动。如果您希望将其作为BGR888,则:

# List of images, all must be the same size and data type.
images=[img0, img1, ...]
avg_img = np.mean(images, axis=0)

也可以为每通道16位执行uint16。如果每个通道处理8位数据,则​​几乎可以肯定不需要100张图像。