R中的滑动窗口功能

时间:2012-03-29 17:21:31

标签: r median image-processing

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

中的图像

2 个答案:

答案 0 :(得分:8)

优秀的栅格包中的函数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

答案 1 :(得分:0)

我知道这是一个古老的问题,但是在寻求解决类似问题时,我遇到过很多次。尽管栅格数据包中的焦点功能非常简单明了,但我发现使用大型栅格时它的速度非常慢。有很多方法可以尝试解决此问题,但是我发现的一种方法是使用系统命令来“白盒工具”,这是一个由命令行驱动的栅格分析工具集。它的主要优点是它可以并行执行工具,并且真正利用了多核CPU。我知道R有许多群集函数和程序包(用于随机森林模型栅格预测),但是我在R中的许多并行计算实现方面都遇到了麻烦。Whitebox工具具有均值,最大值,多数,中位数等离散功能。 ..过滤器(更不用说地形处理工具的负载了,这对于以DEM为中心的分析非常有用)。

一些示例代码,说明如何使用白盒工具在大型机密土地覆盖栅格(nrow = 3793,ncol = 6789,ncell = 25750677)的R in中实现模态或多数滤镜(3x3窗口):

odoStart = int(input ("Starting Odometer Reading:"))
odoEnd = int(input("Ending Odometer Reading:"))****
    print(odoStart)
    print(odoEnd)
totalMiles = (odoEnd - odoStart)  
    print (totalMiles)

上面的代码用了不到3.5秒的时间来执行,同时使用同样来自光栅包的使用“模态”的光栅包“焦点”功能花了5分钟完成了以下代码:

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)

获取编译和安装的白盒工具有点烦人,但是提供了很好的说明。在我看来,这是值得进行的工作,因为它可以使R中原本过慢的栅格过程运行得异常快,并且可以让我使用系统命令保留R中所有内容的编码。