c++ - 用于查找图像堆栈中每个像素的平均值的快速数据结构或算法

标签 c++ algorithm performance image-processing data-structures

我有一堆图像,我想计算其中每个像素的平均值。

例如,设(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 给出了 (x,y ) 我想为堆栈中的每 n 个图像找到的像素。

是否有一种数据结构或算法可以帮助我汇总图像堆栈中的像素强度,并且比我当前的实现更快、更有条理?

我的目标是可移植性,所以我不会使用 OpenCV,而是在 linux 上使用 C++。

最佳答案

问题中嵌套循环的问题在于它对缓存不是很友好。您大步跳过内存,有效地使您的数据缓存变得无用。您将花费大量时间访问内存。

如果您可以节省内存,则可以创建一个额外的图像大小的缓冲区,以便在您按内存顺序遍历所有图像中的所有像素时累积每个像素的总数。然后,您通过缓冲区进行一次除法。

您的累积缓冲区可能需要使用比您用于单个像素值更大的类型,因为它必须累积许多像素值。如果您的像素值是 8 位整数,那么您的累积缓冲区可能需要 32 位整数或 float 。

关于c++ - 用于查找图像堆栈中每个像素的平均值的快速数据结构或算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40660186/

相关文章:

performance - 我的 Clojure 函数在使用列表或向量时可能会很慢吗?

c++ - Visual C++ 2010 native Intellisense 设置

c++ - 当我想根据两个键排序时如何获得 O(log n)?

ScrollView 中的 Android 大表构建速度非常慢

algorithm - 通过边删除创建规则子图

algorithm - 在 DAG 中合并不可达的顶点可能会产生循环?

python - 如何通过矩阵numpy向量化循环

c++ - 从文件中读取类对象c++

c++ - 应用程序无法正常启动(0xc00007b)

c++ - 由于 emmintrin.h,即使使用 -msse2 标志,Clang-cl 也无法构建 NSS lib