This assumes the Bioconductor package EBImage is available.
This many not exactly answer your question but I hope it is helpful. I am not certain of where the code is having problems but I find that combine()
can be very inefficient. There may be a do.call()
call buried in the call to combine, which can consume significant memory.
I find that abind()
of the abind
package is often a very effective solution. Without knowing more about the images you are trying to combine (it does help to provide minimal reproducible examples), let me suggest the following possibility.
# load library and read example color image
library(EBImage)
img <- readImage(system.file("images", "sample-color.png", package="EBImage"))
dim(img)
> [1] 768 512 3
# create a list of 48 images differing in lightness
images <- lapply(runif(48, 0.4, 1/0.4), function(x) img/x)
This is a reasonably sized list of color images. You can view the first image with print(img)
. The last command created 48 copies of the image that vary in lightness.
Now compare the time required to combine the images in that list with combine()
versus abind()
. Incidentally, abind()
has been slightly modified by EBImage
to handle dimnames
differently.
# First with combine()
system.time(x <- combine(images)) # rather fast AMD Ryzen 12-Core CPU
> user system elapsed
> 12.21 3.68 15.90
# Now with abind() where along = 4 adds a fourth dimension needed for the combination
system.time(y <- abind(images, along = 4)) # but much faster here
> user system elapsed
> 0.53 0.02 0.55
# The combined images are the same
identical(x, y)
> [1] TRUE
The timing would likely vary with machines and the need for disk access but it seems like a pretty big difference to me. With many images, abind
is really helpful. You can examine the combination with print(y, nx = 8, all = TRUE)
.
By the way, I would be curious to know if this fixed the "stack usage error."