【发布时间】:2011-05-25 02:56:57
【问题描述】:
我正在使用 C# 进行图像处理并实现积分直方图。我没有详细说明,但假设我有 MxN 矩阵,每个单元格值是其自身及其左上角邻居的总和,减去左上角邻居。这工作得很快,但我想让它更快地处理大图像或实时图像处理性能。
matrix[i,j] += matrix[i-1,j] + matrix[i,j-1] - matrix[i-1,j-1];
实际的实现是:
for (int i = 0; i < width; i++)
for (int j = 0; j < height; j++)
{
int left = 0, upper = 0, u_l_corner = 0;
if (j - 1 >= 0)
{
left = matrix[i, j - 1];
}
if (i - 1 >= 0)
{
upper = matrix[i - 1, j];
}
if (j - 1 >= 0 && i - 1 >= 0)
u_l_corner = matrix[i - 1, j - 1];
matrix[i, j] += left + upper - u_l_corner;
}
因此计算取决于单元格的先前值。因此,它看起来不像可以并行实现(至少对我而言)。但是,还是想在继续之前先确定一下..
能否使用 Parallel.For 或 C# 中的任何其他方法并行实现此算法?如果是这样一个简单的例子是高度赞赏,但如果不是,我最好努力找到一个“平行图像直方图算法”,如果有的话。
提前致谢。
【问题讨论】:
-
不是 100% 确定您的问题(尽管我怀疑您当前的算法是 not 可并行化的),但您可以实施的一个快速优化是填充第一行和第一列最初的矩阵,然后运行您当前的代码。这将为您节省一堆不必要的边界检查在内循环。 (注意:这实际上可能没有什么不同,因为 a)编译器可能已经在以类似的方式进行优化,并且 b)如果矩阵不是那么大,加速(如果有的话)将是最小的。)
-
@dlev:我的问题是算法是否可以并行化。正如我所说,对我来说,它看起来非常像一个不可并行化的算法。你提到的优化是在我的实际程序中实现的,但我没有放在这里是为了让算法清晰简单。谢谢。
标签: c#-4.0 parallel-processing