C++ 如何使用opencv获取100张图像的平均值?

C++ 如何使用opencv获取100张图像的平均值?,c++,opencv,add,average,C++,Opencv,Add,Average,我有100个图像,每个图像是598*598像素,我想通过取像素的平均值来去除图像和噪声,但是如果我想使用“逐像素”的加法,那么我将写一个循环,直到一个图像重复596*598次,而百个图像重复598*598*100次 有什么方法可以帮助我进行此操作吗?首先-将图像转换为浮点数。您有N=100个图像。假设单个图像是一个图像的平均像素值数组。您需要计算N个图像的平均像素值数组 设A-图像X的平均像素值数组,B-图像Y的平均像素值数组。然后C=(A*X+B*Y)/(X+Y)-图像的X+Y的平均像素值数组

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


有什么方法可以帮助我进行此操作吗?

首先-将图像转换为浮点数。您有N=100个图像。假设单个图像是一个图像的平均像素值数组。您需要计算N个图像的平均像素值数组

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


您可以将所有图像像子阵列一样合并到中。在您的情况下,合并操作是
C=(A*X+B*Y)/(X+Y)
,其中
A
B
X
Y
图像的平均像素值数组,您需要在每个图像上循环,并累积结果。由于这可能会导致溢出,您可以将每个图像转换为
CV_64FC3
图像,并在
CV_64FC3
图像上进行累积。您也可以为此使用
CV_32FC3
CV_32SC3
,即使用
float
integer
而不是
double

累积所有值后,您可以使用
convertTo
对以下两个值进行转换:

  • 使图像成为一个
    CV_8UC3
  • 将每个值除以图像的数量,得到实际的平均值
这是一个示例代码,创建100个随机图像,并计算和显示 意思是:

#包括
使用名称空间cv;
Mat3b getMean(常量向量和图像)
{
if(images.empty())返回Mat3b();
//创建一个初始化为0的映像以用作累加器
Mat m(图像[0]。行,图像[0]。cols,CV_64FC3);
m、 setTo(标量(0,0,0,0));
//使用临时图像保存每个输入图像到CV_64FC3的转换
//这将是第一次分配,因为您的所有图像
//同样大小。
垫温;
对于(int i=0;i
假设图像不需要进行变换(伽马变换、颜色空间变换或对齐)。numpy包让您可以快速简洁地完成这项工作

# List of images, all must be the same size and data type.
images=[img0, img1, ...]
avg_img = np.mean(images, axis=0)
这将自动将元素提升为浮动。如果您想要as BGR888,则:

avg_img = avg_img.astype(np.uint8)

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

我不确定我是否正确理解了我回答中的问题,请您评论一下我是否理解正确?我想取100个图像的平均值,我的问题是:如果我通过添加每个像素来取平均值,我的循环将重复598*598*100=25000000次我可以使用移动平均吗?此外,您可能对addWeigted方法感兴趣
avg_img = avg_img.astype(np.uint8)