【问题标题】:Sliding window function in RR中的滑动窗口函数
【发布时间】:2012-03-29 17:21:30
【问题描述】:

有人知道 R 中是否有用于 2d 矩阵而不仅仅是向量的滑动窗口方法。我需要将中值函数应用于存储在矩阵中的图像

【问题讨论】:

标签: r median image-processing


【解决方案1】:

优秀的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 -- 糟糕,看起来它现在已经从 raster 包中消失了(如 ?focalNote: 部分所述) .相反,当前的focal() 可以做旧的focal()focalFilter() 所做的一切。这是通过允许w= 参数交替采用权重矩阵来实现的,这是focalFilter() 过去所做的。简而言之,filter() 已经足够了,我会相应地修改帖子。感谢您指出这一点。
  • 我试过了,效果很好。可悲的是,它挂在 1280x1024 的图像上,窗口宽度约为 10。但是用 3 完成,但在我的计算机上至少需要 5 分钟 :(
  • 太糟糕了。我有兴趣了解是否有更快的替代方案。不过,我并不抱太大希望,因为这似乎是一种固有的耗时的计算类型。 (FWIW,来自 limma 包的 ma3x3.matrix()focal() 慢一点,并且只允许 3×3 移动窗口。)
【解决方案2】:

我知道这是一个老问题,但我在寻求解决类似问题时遇到过很多次。虽然光栅包中的焦点功能非常简单方便,但我发现在处理大型光栅时它非常慢。有很多方法可以尝试解决这个问题,但我发现的一种方法是使用系统命令来“白盒工具”,这是一组命令行驱动的栅格分析工具。它的主要优势在于它并行执行工具并真正利用多核 CPU。我知道 R 有许多集群函数和包(我将其用于随机森林模型栅格预测),但我在 R 中的大部分并行计算实现方面都遇到了困难。Whitebox 工具具有用于均值、最大值、多数、中值等的离散函数。 .. 过滤器(更不用说非常适合以 DEM 为中心的分析的大量地形处理工具)。

关于我如何使用白盒工具在大型分类土地覆盖栅格(nrow=3793、ncol=6789、ncell=25750677)的 R in 中实现模态或多数过滤器(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秒,同时使用“modal”的等效光栅包“focal”功能,同样来自光栅包,耗时5分钟完成,代码如下:

maj_filt_rast<- focal(input_rast, fun=modal, w=matrix(1,nrow=3,ncol=3))

编译和安装白盒工具有点烦人,但提供了很好的说明。在我看来,这是值得付出努力的,因为它使以前在 R 中非常慢的光栅进程运行得非常快,并且它允许我使用系统命令对 R 中的所有内容进行编码。

【讨论】:

    猜你喜欢
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2017-12-20
    • 2013-10-27
    • 2019-02-09
    相关资源
    最近更新 更多