R中有效区域表/积分图像的有效实现

时间:2013-05-14 14:39:06

标签: r loops image-processing runtime integral

我正在尝试构建一个给定图像矩阵的summed area table or integral image。对于那些不知道它是什么的人,来自维基百科:

  

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

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

我试图在R中实现它。但是,我的代码似乎需要很长时间才能运行。

以下是来自this link的伪代码。 in是输入矩阵或图像,intImg是否返回

for i=0 to w do
   sum←0

   for j=0 to h do
      sum ← sum + in[i, j]

      if i = 0 then
         intImg[i, j] ← sum
      else
         intImg[i, j] ← intImg[i − 1, j] + sum
      end if
   end for 
end for

这是我的实施

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

for(i in 1:w){ #x
  sum = 0;
  for(j in 1:h){ #y
    ind = ((j-1)*w)+ (i-1) + 1 #index
    sum = sum + im[ind]
    if(i == 1){
      intImg[ind] = sum
    }else{
      intImg[ind] = intImg[ind-1]+sum
    }
  }
}
intImg = matrix(intImg, h, w, byrow=T)

输入和输出矩阵示例:

enter image description here

但是,在480x640矩阵上,这需要大约4秒钟。在论文中,他们描述了这些维度的毫秒级。

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

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

谢谢

1 个答案:

答案 0 :(得分:5)

您可以尝试使用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