C++ 如何使用opencv获取100张图像的平均值?
我有100个图像,每个图像是598*598像素,我想通过取像素的平均值来去除图像和噪声,但是如果我想使用“逐像素”的加法,那么我将写一个循环,直到一个图像重复596*598次,而百个图像重复598*598*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的平均像素值数组
有什么方法可以帮助我进行此操作吗?首先-将图像转换为浮点数。您有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)