【问题标题】:R concatenating imagesR连接图像
【发布时间】:2017-04-11 19:05:06
【问题描述】:

我正在尝试选择图像顶部的一部分和图像底部的一部分,然后连接顶部下方的底部以生成一个图像。

我一直在用 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)

【问题讨论】:

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

标签: r image concatenation


【解决方案1】:

在示例中提供的特殊情况下,当一个人想要合并同一图像的片段时,实际上可以通过使用数组子集[ 来选择合成图像的一部分,而无需存储中间结果并将它们连接起来。对于适合连接任意来源的图像部分的通用解决方案,请继续阅读。

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 设置行之间的填充(以像素为单位)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多