【发布时间】:2016-11-17 16:31:26
【问题描述】:
我有一堆图像,我想在其中计算堆栈中每个像素的平均值。
例如,让(x_n,y_n) 成为第 n 个图像中的(x,y) 像素。因此,图像堆栈中三个图像的像素(x,y) 的平均值为:
mean-of-(x,y) = (1/3) * ((x_1,y_1) + (x_2,y_2) + (x_3,y_3))
我的第一个想法是将每个图像的所有像素强度加载到具有单个线性缓冲区的数据结构中,如下所示:
|All pixels from image 1| All pixels from image 2| All pixels from image 3|
为了在图像堆栈中找到一个像素的总和,我执行了一系列嵌套的 for 循环,如下所示:
for(int col=0; col<img_cols; col++)
{
for(int row=0; row<img_rows; row++)
{
for(int img=0; img<num_of_images; img++)
{
sum_of_px += px_buffer[(img*img_rows*img_cols)+col*img_rows+row];
}
}
}
基本上,img*img_rows*img_cols 给出了第 n 个图像中第一个像素的缓冲区元素,col*img_rows+row 给出了我想为堆栈中的每个 n 个图像找到的 (x,y) 像素。
是否有一种数据结构或算法可以帮助我总结图像堆栈中的像素强度,比我当前的实现更快、更有条理?
我的目标是可移植性,所以我不会使用 OpenCV,而是在 linux 上使用 C++。
【问题讨论】:
-
我认为您不是在寻找更好的数据结构。我认为您正在寻找更好的算法。每个图像的每个像素都需要存在于内存中的某个点或另一个点;不同的数据结构唯一能做的就是减少你在任何给定时刻使用的内存量。我很难想象一个数据结构会产生 速度 的提高,而不是避免缓存未命中的数据结构,但在这一点上,你可以做其他事情来提高性能。跨度>
-
谢谢。现在编辑更正。我非常愿意接受任何可以提高性能,尤其是速度的建议。
-
更好的解决方案是不要将它们同时保存在内存中根本,而只需对每个图像进行一次传递。
-
为此使用 AVX。它将并行执行乘法和加法。 Google 使用 AVX 计算点积。另请查看具有“Mused 乘加”指令的 Haswell。
标签: c++ algorithm performance image-processing data-structures