有人知道R中是否存在2d矩阵的滑动窗口方法而不仅仅是向量。我需要将中值函数应用于存储在矩阵
中的图像答案 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")
答案 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中所有内容的编码。