2017-04-11 72 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設置填充在各行之間的像素。