use*_*515 5 c++ algorithm performance image-processing data-structures
我有一堆图像,我想在其中计算堆栈中每个像素的平均值.
例如,(x_n,y_n)设为(x,y)第n个图像中的像素.因此,(x,y)图像堆栈中三个图像的像素平均值为:
mean-of-(x,y) = (1/3) * ((x_1,y_1) + (x_2,y_2) + (x_3,y_3))
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是将每个图像的所有像素强度加载到具有单个线性缓冲区的数据结构中,如下所示:
|All pixels from image 1| All pixels from image 2| All pixels from image 3|
Run Code Online (Sandbox Code Playgroud)
为了找到图像堆栈中像素的总和,我执行一系列嵌套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];
}
}
}
Run Code Online (Sandbox Code Playgroud)
基本上img*img_rows*img_cols给出第n个图像中第一个像素的缓冲元素,并col*img_rows+row给出(x,y)我想要为堆栈中的每个n图像找到的像素.
是否有一种数据结构或算法可以帮助我将图像堆栈中的像素强度总结得比我当前的实现更快,更有条理?
我的目标是可移植性,所以我不会使用OpenCV并且在linux上使用C++.
通常,一堆像素
(x_1,y_1),...,(x_n,y_n)
Run Code Online (Sandbox Code Playgroud)
有条件地独立于堆栈
(a_1,b_1),...,(a_n,b_n)
Run Code Online (Sandbox Code Playgroud)
即使它们不是(假设一个特定的数据集),那么对它们的交互进行建模也是一项复杂的任务,并且只会给您平均值的估计。因此,如果您想计算每个堆栈的确切平均值,您没有任何其他选择,只能迭代您提供的三个循环。Matlab/octave 等语言和 Theano (python) 或 Torch7 (lua) 等库都并行化这些迭代。如果您使用 C++,您所做的事情非常适合 Cuda 或 OpenMP。至于可移植性,我认为 OpenMP 是更简单的解决方案。