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