Функция скользящего окна в R

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


person Sergej Andrejev    schedule 29.03.2012    source источник
comment
возможный дубликат алгоритма скользящей медианы в C   -  person Joshua Ulrich    schedule 29.03.2012


Ответы (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")

введите здесь описание изображения

person Josh O'Brien    schedule 29.03.2012
comment
Где focusFilter, вы уверены, что он растровый? - person mdsumner; 30.03.2012
comment
@mdsumner -- К сожалению, похоже, что его больше нет в пакете raster (как объяснено в разделе Примечание: документа ?focal). Вместо этого текущий focal() может делать все, что делали старые focal() и focalFilter(). Этого удалось добиться, позволив аргументу w= альтернативно принимать матрицу весов, что раньше делал focalFilter(). Короче говоря, filter() - это все, что нужно, и я соответствующим образом изменю пост. Спасибо что подметил это. - person Josh O'Brien; 30.03.2012
comment
Я попробовал это, и это работает. К сожалению, он зависает на изображениях 1280x1024 с шириной окна около 10. Однако с 3 он заканчивается, но на моем компьютере это занимает не менее 5 минут :( - person Sergej Andrejev; 30.03.2012
comment
Очень жаль. Мне будет интересно узнать, есть ли более быстрые альтернативы. Однако я не слишком надеюсь, так как это похоже на трудоемкий тип расчета. (FWIW, 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 с помощью системных команд.

person Zachary Brecheisen    schedule 25.01.2019