gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:18:59 26 4
gpt4 key购买 nike

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

例如,设(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com