我正在尝试构造给定图像矩阵的summed area table or integral image。对于那些不知道它是什么的人,来自维基百科:
求和面积表(也称为积分图像)是一种数据结构和算法,用于快速有效地生成网格的矩形子集中的值之和
换句话说,它用于在恒定时间内对图像/矩阵中任何矩形区域的值求和。
我正在尝试在R中实现此功能。但是,我的代码似乎需要花费很长时间才能运行。
这是this link中的伪代码。 in
是输入矩阵或图像,intImg
是返回的内容
因为我= 0去做
总和←0
对于j = 0到h
sum←sum + in [i,j]
如果我= 0
intImg [i,j]←总和
其他
intImg [i,j]←intImg [i-1,j] +和
万一
结束于
结束于
这是我的实现
w = ncol(im)
h = nrow(im)
积分= c(NA)
长度(intImg)= w * h
for(i在1:w中){#x
总和= 0;
for(j in 1:h){#y
ind =((j-1)* w)+(i-1)+ 1#索引
sum = sum + im [ind]
if(i == 1){
intImg [ind] =总和
}其他{
intImg [ind] = intImg [ind-1] +和
}
}
}
intImg =矩阵(intImg,h,w,byrow = T)
输入和输出矩阵的示例:
但是,在480x640
矩阵上,这大约需要4秒钟。在本文中,他们将这些尺寸描述为以毫秒为单位。
我在循环或索引中做的效率低下吗?
我考虑过用C ++编写并将其包装在R中,但是我对C ++不太熟悉。
谢谢
最佳答案
您可以尝试使用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