Функция раздвижного окна в R - PullRequest
2 голосов
/ 29 марта 2012

Кто-нибудь знает, существует ли метод скользящего окна в R для 2d матриц, а не только для векторов. Мне нужно применить медианную функцию к изображению, хранящемуся в матрице

Ответы [ 2 ]

8 голосов
/ 30 марта 2012

Функция 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")

enter image description here

0 голосов
/ 25 января 2019

Я знаю, что это старый вопрос, но я сталкивался с этим много раз, пытаясь решить подобную проблему. Хотя фокальная функция в растровом пакете очень проста и удобна, я обнаружил, что она работает очень медленно при работе с большими растрами. Есть много способов решить эту проблему, но я нашел один способ - использовать системные команды для «инструментов белого ящика», представляющих собой набор инструментов для растрового анализа, управляемый из командной строки. Его главное преимущество заключается в том, что он выполняет инструменты параллельно и действительно использует преимущества многоядерных процессоров. Я знаю, что R имеет много кластерных функций и пакетов (которые я использую для прогнозирования растров в модели случайного леса), но я боролся с большей частью реализации параллельных вычислений в R. У инструментов Whitebox есть дискретные функции для среднего, максимального, большинства, медианы и т. Д. .. фильтры (не говоря уже о множестве инструментов для обработки рельефа, которые отлично подходят для анализа ЦМР).

Некоторые примеры кода для того, как я внедрил модальный или мажоритарный фильтр (окно 3x3) в 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 с помощью системных команд.

...