我需要将高分辨率的正射马赛克照片从sRGB转换为Lab色彩空间。我尝试使用基本R函数convertColor()
,但我从未完成至少一次转换(图像超过10公顷,像素分辨率为5厘米,约为50.0000.0000像素)。
我尝试使用patchPlot
包,它的计算速度更快。但是,考虑到我的图像的大小,我正在寻找一种更好的方法。
是否有改进此计算的包/函数/方法?
使用convertColor
和patchPlot::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 :(得分: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)))