Улучшить скорость преобразования цвета из sRGB в Lab
Мне нужно преобразовать орто-мозаичные фотографии с высоким разрешением из 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
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)))