R中的滑动窗口函数

4

请问是否有R语言中针对二维矩阵而非向量的滑动窗口方法?我需要对存储在矩阵中的图像应用中位数函数。


可能是在C中实现滚动中位数算法的重复问题。 - Joshua Ulrich
2个回答

12

在优秀的raster包中,函数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")

在此输入图片描述


focalFilter在哪里,你确定它在栅格中吗? - mdsumner
@mdsumner -- 哎呀,看起来它现在已经从 raster 包中消失了(如 ?focal 中的 Note: 部分所解释的那样)。相反,当前的 focal() 可以做到旧的 focal()focalFilter() 所能做的一切。这是通过允许 w= 参数交替采用权重矩阵来实现的,这就是 focalFilter() 以前所做的。简而言之,现在只需要 filter() 就可以了,我会相应地修改帖子。感谢您指出这一点。 - Josh O'Brien
我尝试了一下,它可以工作。不幸的是,在窗口宽度约为10的1280x1024图像上会卡住。然而,使用3时虽然可以完成,但在我的电脑上至少需要5分钟:( - Sergej Andrejev
太糟糕了。如果有更快的替代方案,我会很感兴趣学习。不过,我并不抱太大希望,因为这似乎是一种本质上耗时的计算类型。(顺便说一下,来自 limma 包的 ma3x3.matrix()focal() 稍慢一些,并且仅允许使用 3x3 的移动窗口。) - Josh O'Brien

1
我知道这是一个老问题,但在寻找解决类似问题时,我遇到了很多次。虽然raster包中的focal函数非常简单方便,但我发现在处理大型栅格数据时速度非常慢。有许多方法可以尝试解决这个问题,但我发现一种方法是使用系统命令来调用“whitebox tools”,它是一组基于命令行的栅格分析工具。其主要优点是并行执行工具,并真正利用多核CPU。我知道R有许多集群函数和软件包(我用于随机森林模型栅格预测),但我在R中的并行计算实现方面遇到了很多困难。Whitebox工具具有离散函数,可用于平均值、最大值、多数、中位数等过滤器(更不用说大量的地形处理工具,非常适合DEM中心的分析)。
以下是我如何在R中使用whitebox tools实现大型分类土地覆盖栅格数据(nrow=3793, ncol=6789, ncell=25750677)的模态或多数过滤器(3x3窗口)的示例代码:
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))

编译和安装白盒工具有点烦人,但提供了良好的说明。在我看来,这个过程非常值得,因为它使得以前在R中运行缓慢的栅格处理变得惊人地快速,并且允许我将所有内容的编码保留在R中使用系统命令。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接