I am trying to construct a summed area table or integral image given an image matrix. For those of you who dont know what it is, from wikipedia:
A summed area table (also known as an integral image) is a data structure and algorithm for quickly and efficiently generating the sum of values in a rectangular subset of a grid
In other words, its used to sum up values of any rectangular region in the image/matrix in constant time.
I am trying to implement this in R. However, my code seems to take too long to run.
Here is the pseudo code from this link. in
is the input matrix or image and intImg
is whats returned
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
And here is my implementation
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)
Example of input and output matrix:
However, on a 480x640
matrix, this takes ~ 4 seconds. In the paper they describe it to take on the order of milliseconds for those dimensions.
Am I doing something inefficient in my loops or indexing?
I considered writing it in C++ and wrapping it in R, but I am not very familiar with C++.
Thank you
im
would make this reproducible. it's hard for me to parse what you're doing without an example, but you can probably usecolSums()
androwSums()
or some other vectorized function(s). – Chaseim
is just any matrix. I've added an example of the input and output in the question – Omar WagihintImg = c(NA)
tointImg <- rep(NA, 480*460)
? – joran