1

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

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

现在我需要做的是取周围细胞的平均值,以平均出缺失细胞的像素值。

现在我可以暴力破解它,但它很快就会变得丑陋。有什么优雅的解决方案吗?

4

2 回答 2

2

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

  • 在一个方向上整合细胞(比如水平)
  • 在另一个方向整合细胞(比如垂直)
  • 取每个单元格与其左侧第 N 个邻居之间的差异。
  • 取每个单元格和它的第 N 个低邻居之间的差异

像这样:

    对于 (i = 0; i < h; ++i)
    对于 (j = 0; j < w-1; ++j)
       A[i][j+1] += A[i][j];
    对于 (i = 0; i < h-1; ++i)
    对于 (j = 0; j < w; ++j)
       A[i+1][j] += A[i][j]
    对于 (i = 0; i < h; ++i)
    对于 (j = 0; j < wN; ++j)
       A[i][j] -= A[i][j+N];
    对于 (i = 0; i < hN; ++i)
    对于 (j = 0; j < w; ++j)
       A[i][j] -= A[iN][j];

这是做什么的:

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

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

The cool thing is that if you use ordinary two's-complement arithmetic, you don't have to worry about any overflows in the first two passes; they cancel out in the last two passes.

于 2009-11-03T18:52:08.423 回答
0

这里的主要问题是利用所有可用的内核和缓存效率。
您可能对检查卷积的快速实现感兴趣。
但是,由于您使用 Boost 执行此操作,因此您可以在这个 Boost 示例
中检查它是如何完成的, 我相信您只需为您的专门任务更改卷积核。

于 2009-11-03T14:01:22.907 回答