2017-08-18 75 views
1

我需要將sRGB的高分辨率正射馬賽克照片轉換爲Lab色彩空間。我嘗試過使用基本R功能convertColor(),但我從未完成過至少一次轉換(圖像超過10公頃,5釐米像素分辨率,〜50.0000.0000像素)。提高從sRGB到Lab色彩轉換的速度

我試過用patchPlot包,它有更快的計算。但是,考慮到我的圖像的大小,我正在尋找一種更好的方式來做到這一點。

是否有改進此計算的包/函數/方法?

示例測試與convertColorpatchPlot::RGB2Lab

library(raster) 
library(patchPlot) 
library(microbenchmark) 

r <- stack(system.file("external/rlogo.grd", package="raster")) 

microbenchmark(baseR = convertColor(color = values(r), from = 'sRGB', to = 'Lab'), 
       patchPlot = RGB2Lab(values(r))) 
## Unit: milliseconds 
##  expr  min  lq  mean median  uq  max neval cld 
##  baseR 261.702873 282.60345 316.76008 310.31006 327.05536 550.07653 100 b 
## patchPlot 8.335807 9.58279 11.53369 10.11684 11.69073 46.78427 100 a 
+0

將RasterStack分成RasterLayers並在其上運行RGB2Lab是否有意義? – PoGibas

+0

@PoGibas'RGB2Lab'的輸入是3列矩陣,我不能分割它 –

+0

甚至不是行? – PoGibas

回答

1

這遠非完美的解決方案,但我們可以嘗試改善它。可以玩的東西是nMatrix(將多少個矩陣分成原始RGB矩陣)。

library(microbenchmark) 
library(parallel) 
library(patchPlot) 
library(raster) 

# How many matrices we want to have 
nMatrix <- 4 

# Load raster 
r <- stack(system.file("external/rlogo.grd", package = "raster")) 
# Extract value matrix 
rValues <- values(r) 
n <- nrow(rValues) 

# Groups to split rValues into nMatrix parts 
foo <- rep(1:nMatrix, each = ceiling(n/nMatrix)) 
# If group vector exceeds number of rows in matrix then trim it 
if (length(foo) > n) { 
    foo <- foo[1:n] 
} 
# Splitted matrices 
rValuesSplit <- lapply(split(rValues, foo), matrix, ncol = 3) 

microbenchmark(do.call(rbind,mclapply(rValuesSplit, RGB2Lab, mc.cores = 1))) 
+0

這是一個很好的方法。但是我測試這個比較'RGB2Lab()'的方案,沒有在Windows/OS X機器上用R和MRO並行化,我沒有發現有意義的差異 –