UBLAS矩阵查找单元格的周围值?

时间:2009-11-03 13:39:20

标签: c++ boost matrix ublas

我正在寻找一种优雅的方式来实现这一点。基本上我有一个m×n矩阵。其中每个单元格表示像素值,行和列表示图像的像素行和像素列。

因为我基本上映射了HDF文件中的点以及它们对应的像素值。我们基本上有很多空像素。其中填充了0。

现在我需要做的是获取周围单元格的平均值,以平均丢失单元格的像素值。

现在我可以蛮力这个,但它变得很难看。对此有什么优雅的解决方案吗?

2 个答案:

答案 0 :(得分:2)

这个过滤问题有一个众所周知的优化。

  • 将细胞整合到一个方向(比如水平)
  • 将细胞整合到另一个方向(比如垂直方向)
  • 取每个单元格之间的区别,并且它是左边的第N个邻居。
  • 取每个单元格和它的第N个下邻居
  • 之间的区别

像这样:     

    for (i = 0; i < h; ++i)
    for (j = 0; j < w-1; ++j)
       A[i][j+1] += A[i][j];
    for (i = 0; i < h-1; ++i)
    for (j = 0; j < w; ++j)
       A[i+1][j] += A[i][j]
    for (i = 0; i < h; ++i)
    for (j = 0; j < w-N; ++j)
       A[i][j] -= A[i][j+N];
    for (i = 0; i < h-N; ++i)
    for (j = 0; j < w; ++j)
       A[i][j] -= A[i-N][j];

这是做什么的:

  • 第一遍使每个单元格成为该行左边所有单元格的总和,包括它自己。
  • 第二遍之后,每个单元格是itselt上方和左侧矩形中所有单元格的总和(包括它自己的行和列)
  • 在第3遍之后,每个单元格是其上方和右侧的矩形的总和,N列宽。
  • 在第4遍之后,每个单元格是下方和右侧的NxN矩形的总和。

每个单元需要4次操作来计算总和,而蛮力需要8次(假设您正在进行3x3平均滤波)。

很酷的是,如果你使用普通的二进制补码运算,你不必担心前两次传递中的任何溢出;他们在最后两次通过中取消了。

答案 1 :(得分:0)

这里的主要问题是利用所有可用的内核和缓存效率。
您可能有兴趣检查卷积的快速实现。
但是,由于您使用Boost执行此操作,因此可以在this Boost example中查看如何执行此操作
我相信你必须只为你的专业任务改变卷积内核。