Кто-нибудь знает, есть ли в R метод скользящего окна для двумерных матриц, а не только для векторов. Мне нужно применить медианную функцию к изображению, хранящемуся в матрице
Функция скользящего окна в R
Ответы (2)
Для этого хорошо подходит функция focal()
в отличном пакете raster. Он принимает несколько аргументов помимо тех, что показаны в примере ниже, и может использоваться для указания непрямоугольного скользящего окна, если это необходимо.
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")
?focal
). Вместо этого текущий focal()
может делать все, что делали старые focal()
и focalFilter()
. Этого удалось добиться, позволив аргументу w=
альтернативно принимать матрицу весов, что раньше делал focalFilter()
. Короче говоря, filter()
- это все, что нужно, и я соответствующим образом изменю пост. Спасибо что подметил это.
- person Josh O'Brien; 30.03.2012
ma3x3.matrix()
из пакета limma немного медленнее, чем focal()
, и допускает перемещение окна только 3 на 3.)
- person Josh O'Brien; 30.03.2012
Я знаю, что это старый вопрос, но я много раз сталкивался с этим, пытаясь решить подобную проблему. Хотя функция фокусировки в растровом пакете очень проста и удобна, я обнаружил, что она очень медленная при работе с большими растрами. Есть много способов решить эту проблему, но один из способов, который я нашел, — это использование системных команд для «инструментов белого ящика», которые представляют собой набор инструментов анализа растров, управляемый из командной строки. Его главное преимущество в том, что он выполняет инструменты параллельно и действительно использует преимущества многоядерных процессоров. Я знаю, что в R есть много кластерных функций и пакетов (которые я использую для растрового прогнозирования модели случайного леса), но я боролся с большей частью реализации параллельных вычислений в R. Инструменты Whitebox имеют дискретные функции для среднего, максимального, большинства, медианы и т. д. .. фильтры (не говоря уже о множестве инструментов обработки ландшафта, которые отлично подходят для анализа, ориентированного на ЦМР).
Некоторый пример кода того, как я реализовал модальный или мажоритарный фильтр (окно 3x3) в R в большом классифицированном растре земного покрова (nrow=3793, ncol=6789, ncell=25750677) с помощью инструментов белого ящика:
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 с помощью системных команд.