2009-11-03 35 views
1

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

由于我基本上映射点从HDF文件,与它们对应的像素值沿。我们基本上有很多空像素。填充有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平均过滤器)。

很酷的事情是,如果你使用普通的二进制补码算术,你不必担心在第一两遍任何溢出;他们在最后两场比赛中取消了比赛。

0

的主要问题是在这里利用所有可用内核和缓存效益分析。
您可能有兴趣检查卷积的快速实现。
不过,既然你有升压这样做,你可以检查这是如何this Boost example
我beleive你只改变卷积核为您专门的工作完成。

相关问题