r - 通过移动平均滑动窗口方法,使用 rollmean、filter、rollapply 或其他 R 工具平滑 2D 矩阵

标签 r image-processing matrix mean moving-average

我试图在 R 中找到一个函数,它可以平滑二维矩阵,该矩阵已经根据窗口的长度在矩阵周围填充了零。如果窗口大小为 3,那么我们从顶部、底部、右侧和左侧传递 3 个零,然后进行平均以使其平滑。我在 SO 和其他教程中找到了 rollmean,但它并不完全符合我的要求。我需要(假设窗口大小为 3)我们考虑一个 3*3 的窗口并取平均值并将其替换为当前窗口的当前元素,然后将窗口向右移动一个单位(像素)。例如,当我们到达最右端时,我们通过从最左角向下一个单位来开始窗口化。 这就是 rollmean 所做的,我不想要的。我希望保留所有 9 个元素。

> xm<-matrix(c(1,2,3,4,5,6,7,8,9),ncol=3)
> xm
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
> rollmean(xm,3)
     [,1] [,2] [,3]
[1,]    2    5    8

这是如上所述的填充函数:

mat.pad<-function(X,k){
  dims<-dim(X)
  n<-dims[1]
  m<-dims[2]
  pad.X <- matrix(0, n + 2 * k, m + 2 * k)
  pad.X[(k + 1):(n + k), (k + 1):(m + k)] <- X
  return(pad.X)
}

想象一下这是我的 X:

> X
      [,1] [,2] [,3]
 [1,]  0.5  0.3  0.2
 [2,]  0.5  0.4  0.1
 [3,]  0.4  0.4  0.3
 [4,]  0.4  0.3  0.3
 [5,]  0.3  0.2  0.2
 [6,]  0.5  0.2  0.2
 [7,]  0.5  0.4  0.1
 [8,]  0.4  0.4  0.5
 [9,]  0.3  0.3  0.5

这是 k=3 的填充版本(窗口 =3*3)

> mat.pad(X,3)
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
 [1,]    0    0    0  0.0  0.0  0.0    0    0    0
 [2,]    0    0    0  0.0  0.0  0.0    0    0    0
 [3,]    0    0    0  0.0  0.0  0.0    0    0    0
 [4,]    0    0    0  0.5  0.3  0.2    0    0    0
 [5,]    0    0    0  0.5  0.4  0.1    0    0    0
 [6,]    0    0    0  0.4  0.4  0.3    0    0    0
 [7,]    0    0    0  0.4  0.3  0.3    0    0    0
 [8,]    0    0    0  0.3  0.2  0.2    0    0    0
 [9,]    0    0    0  0.5  0.2  0.2    0    0    0
[10,]    0    0    0  0.5  0.4  0.1    0    0    0
[11,]    0    0    0  0.4  0.4  0.5    0    0    0
[12,]    0    0    0  0.3  0.3  0.5    0    0    0
[13,]    0    0    0  0.0  0.0  0.0    0    0    0
[14,]    0    0    0  0.0  0.0  0.0    0    0    0
[15,]    0    0    0  0.0  0.0  0.0    0    0    0

如何滑动平均窗口?

最佳答案

我不确定我是否明白了这个想法,但我认为可以通过raster::focal?来实现。 请参阅this post

library(raster)
x <- matrix(c(1,2,3,4,5,6,7,8,9),ncol=3)
x
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

r <- raster(x) # convert to rasterLayer
## sliding a 3x3 window
agg <- as.matrix(focal(r, matrix(1, 3, 3), mean, pad = T, padValue = 0))
agg

         [,1]     [,2]     [,3]
[1,] 1.333333 3.000000 2.666667
[2,] 2.333333 5.000000 4.333333
[3,] 1.777778 3.666667 3.111111

在您的示例上运行

x2 <- mat.pad(X=x, 3)
r2 <- raster(x2)
as.matrix(focal(r2, matrix(1, 3, 3), mean, pad = T, padValue = 0))
      [,1] [,2]      [,3]      [,4]     [,5]     [,6]      [,7] [,8] [,9]
 [1,]    0    0 0.0000000 0.0000000 0.000000 0.000000 0.0000000    0    0
 [2,]    0    0 0.0000000 0.0000000 0.000000 0.000000 0.0000000    0    0
 [3,]    0    0 0.1111111 0.5555556 1.333333 1.222222 0.7777778    0    0
 [4,]    0    0 0.3333333 1.3333333 3.000000 2.666667 1.6666667    0    0
 [5,]    0    0 0.6666667 2.3333333 5.000000 4.333333 2.6666667    0    0
 [6,]    0    0 0.5555556 1.7777778 3.666667 3.111111 1.8888889    0    0
 [7,]    0    0 0.3333333 1.0000000 2.000000 1.666667 1.0000000    0    0
 [8,]    0    0 0.0000000 0.0000000 0.000000 0.000000 0.0000000    0    0
 [9,]    0    0 0.0000000 0.0000000 0.000000 0.000000 0.0000000    0    0

关于r - 通过移动平均滑动窗口方法,使用 rollmean、filter、rollapply 或其他 R 工具平滑 2D 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23622379/

相关文章:

R基础图形圆形直方图

r - 如何使用 dplyr 的 coalesce 函数和 group_by() 为每个人创建一行并填充所有值?

algorithm - 如何计算轮廓的直方图?

python - 使用 OpenCV Python 以与引用图像相同的方向和尺寸转换和显示裁剪图像

python - python中的特征值和向量计算错误

c++ - 稀疏矩阵坐标存储格式: convert from row-major to column-major

r - 无法通过CRAN安装opencpu

r - 更改ggplot2中的字体

php - 使用 PHP 将分辨率转换为纵横比

c++ - 使用 C++ 从 txt 加载 float/double 矩阵