Функция раздвижного окна в R
Кто-нибудь знает, есть ли метод скользящего окна в R для 2d матриц, а не только для векторов. Мне нужно применить медианную функцию к изображению, сохраненному в матрице
1 ответ
Функция focal()
в отличном растровом пакете это хорошо. Он принимает несколько аргументов, помимо тех, которые показаны в примере ниже, и может использоваться для указания непрямоугольного скользящего окна, если это необходимо.
library(raster)
## Create some example data
m <- matrix(1, ncol=10, nrow=10)
diag(m) <- 2
r <- as(m, "RasterLayer") # Coerce matrix to RasterLayer object
## Apply a function that returns a single value when passed values of cells
## in a 3-by-3 window surrounding each focal cell
rmean <- focal(r, w=matrix(1/9, ncol=3, nrow=3), fun=mean)
rmedian <- focal(r, w=matrix(1/9, ncol=3, nrow=3), fun=median)
## Plot the results to confirm that this behaves as you'd expect
par(mfcol=c(1,3))
plot(r)
plot(rmean)
plot(rmedian)
## Coerce results back to a matrix, if you so desire
mmean <- as(rmean, "matrix")
Я знаю, что это старый вопрос, но я сталкивался с этим много раз, пытаясь решить подобную проблему. Хотя фокальная функция в растровом пакете очень проста и удобна, я обнаружил, что она работает очень медленно при работе с большими растрами. Есть много способов решить эту проблему, но я нашел один способ - использовать системные команды для "инструментов белого ящика", представляющих собой набор инструментов для растрового анализа, управляемый из командной строки. Его главное преимущество заключается в том, что он выполняет инструменты параллельно и действительно использует преимущества многоядерных процессоров. Я знаю, что R имеет много кластерных функций и пакетов (которые я использую для прогнозирования растров в модели случайного леса), но я боролся с большей частью реализации параллельных вычислений в R. У инструментов Whitebox есть дискретные функции для среднего, максимального, большинства, медианы и т. Д... фильтры (не говоря уже о множестве инструментов для обработки рельефа, которые отлично подходят для анализа ЦМР).
Некоторые примеры кода для того, как я реализовал модальный или мажоритарный фильтр (окно 3х3) в R большого классифицированного растра растительного покрова (nrow=3793, ncol=6789, ncell=25750677) с использованием инструментов whitebox:
system('C:/WBT2/target/release/whitebox_tools --wd="D:/Temp" ^
--run=MajorityFilter -v --input="input_rast.tif" ^
--output="maj_filt_rast.tif" --filterx=3 --filtery=3',
wait = T, timeout=0, show.output.on.console = T)
Выполнение приведенного выше кода заняло менее 3,5 секунд, в то время как эквивалентная функция "focal" растрового пакета с использованием "modal", также из растрового пакета, заняла 5 минут, чтобы выполнить код, приведенный ниже:
maj_filt_rast<- focal(input_rast, fun=modal, w=matrix(1,nrow=3,ncol=3))
Получение скомпилированных и установленных инструментов whitebox немного раздражает, но есть хорошие инструкции. На мой взгляд, это того стоит, поскольку растровые процессы, которые ранее были чрезмерно медленными в R, выполняются на удивление быстро, и это позволяет мне сохранять кодирование всего внутри R с помощью системных команд.