我正在使用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#中的任何其他方法并行实现此算法吗?如果是这样,一个简单的例子被高度赞赏,但如果没有,我最好找到一个“并行图像直方图算法”,如果有的话。
提前致谢。
答案 0 :(得分:0)
就我而言,可以使这个算法并行,但如果您的矩阵相对较小(处理时间少于几毫秒),我发现没有这样做。
如果您对使此算法并行非常感兴趣,可以将此任务拆分为“j”任务(“y”轴中的项目数)。
执行此操作的关键是启动第一个线程来计算此矩阵的第一行中的点([i,0]),然后开始第二个线程延迟 - 第二个线程应该追逐第一个线程 - 必须永远不要超过前一个线程。