提高从sRGB到Lab的色彩转换速度

时间:2017-08-18 18:28:43

标签: r performance raster color-conversion

我需要将高分辨率的正射马赛克照片从sRGB转换为Lab色彩空间。我尝试使用基本R函数convertColor(),但我从未完成至少一次转换(图像超过10公顷,像素分辨率为5厘米,约为50.0000.0000像素)。

我尝试使用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 

1 个答案:

答案 0 :(得分: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)))