我正在尝试在for
循环中将多个图像(500张图片)合并在一起。图像大小是恒定的,甚至不会太大(225 * 410 px)。我需要获得一张由500张并排粘贴在一起的初始图片组成的图像。
我已经尝试过使用软件包EBImage的某些功能进行for
循环。 abind()
就像传统的rbind()
一样。我使用的代码如下:
library(abind)
#path=a list containing the paths of the source images
final_image<-readImage(path[1]) #initialize the final image
for (i in 2:500){
im <- readImage(path[i]) #open the i-esim image
final_image <- abind(final_image,im,along=1) #paste the i-esim image with the previous one
}
该代码有效,但是显然很慢,因为每次迭代final_image
的大小都会变大。
有人知道更快的解决方法吗?谢谢!
答案 0 :(得分:1)
通常,迭代地rbind
(也适用于其他*bind
函数)是一个非常糟糕的主意,因为它会在循环中的每次迭代中生成完整的副本(如您所注意到的)。请注意,在?abind
中,它花费...
:
... Any number of vectors, matrices, arrays, or data frames. The
dimensions of all the arrays must match, except on one dimension
(specified by along=). If these arguments are named, the name will be
used for the name of the dimension along which the arrays are joined.
Vectors are treated as having a dim attribute of length one.
这允许我们使用do.call
一次对所有图像的单个列表进行绑定。试试这个(未试用):
list_of_images <- lapply(path, readImage)
combined <- do.call(abind, c(list_of_images, list(along = 1)))