计算一组像素的最大值

时间:2018-04-04 11:12:57

标签: r max aggregate pixel raster

我有一个分辨率为1,1的光栅图像。

我想将分辨率降低到4.4,但仍然具有构成新的4,4像素的像素的最大值。

我可以使用以下方法降低分辨率:

chm4 <- aggregate(chm, 4)

但是,这会为您提供构成此新像素的每个像素的平均最大值。

我尝试将栅格转换为矩阵,因此它采用以下形式:

     [,1]  [,2] [,3] [,4] [,5] [,6] [,7] [,8]...
[1,]  63    34   45   76   21   54   35   45
[2,]  77    54   43   34   12   23   73   26
[3,]  56    73   26   27   81   29   34   52
[4,]  31    48   61   35   76   38   17   87
[5,]  16    24   71   45   58   60   14   35
[6,]  28    64   27   63   18   62   43   27
[7,]  27    48   76   27   54   61   52   44
[8,]  56    37   53   62   37   47   52   38 
...

有没有办法计算所有值的最大值,例如,第1行到第4行以及第1列到第4列?

这也需要在整个矩阵中应用,其中有1000个行和列回到矩阵形式,如下所示:

    [,1][,2]...
[1,] 77  87
[2,] 76  62
...

2 个答案:

答案 0 :(得分:0)

您可以将矩阵转换为数组并使用apply。如果您的数据不是很大,那么对于大多数应用来说,这应该足够快。

#the example data
M <- structure(c(63L, 77L, 56L, 31L, 16L, 28L, 27L, 56L, 34L, 54L, 
                 73L, 48L, 24L, 64L, 48L, 37L, 45L, 43L, 26L, 61L, 71L, 27L, 76L, 
                 53L, 76L, 34L, 27L, 35L, 45L, 63L, 27L, 62L, 21L, 12L, 81L, 76L, 
                 58L, 18L, 54L, 37L, 54L, 23L, 29L, 38L, 60L, 62L, 61L, 47L, 35L, 
                 73L, 34L, 17L, 14L, 43L, 52L, 52L, 45L, 26L, 52L, 87L, 35L, 27L, 
                 44L, 38L), .Dim = c(8L, 8L), .Dimnames = list(NULL, NULL))

#create an array
A <- M
dim(A) <- c(2, nrow(M) / 2, 2, ncol(M) / 2)

#loop over the appropriate margins    
apply(A, c(2, 4), max)
#     [,1] [,2] [,3] [,4]
#[1,]   77   76   54   73
#[2,]   73   61   81   87
#[3,]   64   71   62   43
#[4,]   56   76   61   52

如果这太慢,那么为这个特定任务编写Rcpp函数会很容易。你只需要一个双循环。

答案 1 :(得分:0)

这是另一种可能性,在样本矩阵(mat)上使用for循环:

x <- sample(1:100, 100, replace = TRUE)
mat <- matrix(x, nrow = 10)
mat2 <- matrix(nrow = nrow(mat)/4, ncol = ncol(mat)/4)

for(i in 1:dim(mat2)[1]) {
  for(j in 1:dim(mat2)[2]) {
    row <- 4 * (i - 1) + 1
    col <- 4 * (j - 1) + 1
    mat2[i,j] <- max(mat[row:(row + 3), col:(col + 3)])
  }
}