5

我正在尝试在给定图像矩阵的情况下构建总面积表或积分图像。对于那些不知道它是什么的人,来自维基百科:

面积求和表(也称为积分图像)是一种数据结构和算法,用于快速有效地生成网格矩形子集中的值之和

换句话说,它用于在恒定时间内对图像/矩阵中任何矩形区域的值求和。

我正在尝试在 R 中实现这一点。但是,我的代码似乎需要很长时间才能运行。

这是此链接的伪代码。in是输入矩阵或图像,intImg是什么返回

对于 i=0 到 w 做
   总和←0

   对于 j=0 到 h 做
      sum ← sum + in[i, j]

      如果 i = 0 那么
         intImg[i, j] ← 总和
      别的
         intImg[i, j] ← intImg[i - 1, j] + sum
      万一
   结束
结束

这是我的实现

w = ncol(im)
h = nrow(im)
intImg = c(NA)
长度(intImg)= w*h

for(i in 1:w){ #x
  总和 = 0;
  for(j in 1:h){ #y
    ind = ((j-1)*w)+ (i-1) + 1 #index
    总和 = 总和 + im[ind]
    如果(我 == 1){
      intImg[ind] = 总和
    }别的{
      intImg[ind] = intImg[ind-1]+sum
    }
  }
}
intImg = 矩阵(intImg,h,w,byrow=T)

输入输出矩阵示例:

在此处输入图像描述

然而,在480x640矩阵上,这需要大约 4 秒。在论文中,他们将这些维度描述为以毫秒为单位。

我是否在循环或索引中做一些低效的事情?

我考虑用 C++ 编写它并用 R 包装它,但我对 C++ 不是很熟悉。

谢谢

4

1 回答 1

6

您可以尝试使用apply(如果您预先分配内存,它不会比您的 for 循环快):

areaTable <- function(x) {
  return(apply(apply(x, 1, cumsum), 1, cumsum))
}

areaTable(m)
#      [,1] [,2] [,3] [,4]
# [1,]    4    5    7    9
# [2,]    4    9   12   17
# [3,]    7   13   16   25
# [4,]    9   16   22   33
于 2013-05-14T15:15:14.660 回答