2017-04-11 73 views
2

我想选择图像顶部的一部分和图像底部的一部分,然后连接底部的顶部以产生一个图像。R拼接图像

我一直在尝试EBImage,并成功地捕获了顶部和底部,但不能把它们放在一起。

以下是一些测试代码:

library("EBImage") 
display(imgcol) 

dims <- dim(imgcol) 
dims 

# top 
range <- c(1:round(.185*dims[2]))       
image.top <- imgcol[round(dims[1]*.25):round(dims[1]*.75),range,] 
display(image.top) 
dim(image.top) 

#bottom 
range <- (dims[2]-round(.185*dims[2])):dims[2] 
image.bot <- imgcol[round(dims[1]*.25):round(dims[1]*.75),range,] 
display(image.bot) 
dim(image.bot) 

# How do I concatenate images? 
# The following creates a large numeric, not a large image 
test <- c(image.top,image.bot) 
+0

请考虑在您的示例中加载示例图像,以使其可以被任何人重现: 'f < - system.file(“images”,“sample-color.png”,package =“EBImage”); imgcol < - readImage(f)'(用换行符替换';')。 您还可以通过避免重复提取数组索引中的X范围的公式来提高代码的可读性: 'xran < - round(dims [1] *。25):round(dims [1] *。75 ); yran < - 1:round(.185 * dims [2]); image.top < - imgcol [xran,yran,]'。 – aoles

回答

0

在所提供的示例的特殊情况下,当一个人想合并同一个图像的块它实际上是可以选择的合成图像的部分只是通过使用阵列子集[,而不需要存储中间结果并连接它们。适用于连接任意原点图像部分的通用解决方案。

xran <- round(dims[1]*.25):round(dims[1]*.75) 
yran <- c(1:round(.185*dims[2]), (dims[2]-round(.185*dims[2])):dims[2]) 
imgcol[xran,yran,] 

图像被表示为多维数组,所以你可以使用abind将它们串联。指定along=2堆栈他们一个在另一个之上,

library("abind") 

imgdat <- abind(image.top, image.bot, along=2) 

along=1将它们一个挨着另一个。

当前没有为Image对象定义的特定方法abind,因此输出imgdat是一个普通数组。使用Image和适当的colorMode进行重建。

imgnew <- Image(imgdat, colormode=colorMode(imgcol)) 

实现这一点的另一种方式是使用EBImage的功能tile它通过combine获得的图像栈上运行。然而,该解决方案需要组合的图像具有相同的尺寸。

tile(combine(image.top, image.bot), nx=1, lwd=0) 

的参数nx=1指定每一行只包含单个图像有效地连接所有帧中的列,以及lwd设置填充在各行之间的像素。