在 r 中裁剪(子集)光栅图像(矩阵)
cropping (subsetting) raster image (matrix) in r
我希望能够将由矩阵组成的光栅图像拆分成单独的 matrix/images,以便我可以比较它们。
举个例子,假设我有这张光栅图像-
library(grid)
m = matrix(c( .7, .7, .7, .7, .7, .7, .7, .3, .7, .7, .3, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .3, .7, .7, .3, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .3, .7, .7, .3, .7, .7, .7, .7, .7, .7, .7), nrow = 6, ncol=9)
grid.raster(m)
我想 "crop" 将其放入 6 个单独的单元格中,将每个单元格保存为自己的矩阵。
我一直在想这可能是基于维度。
d <- dim(m)
然后知道我的单元格都是 x 维度的 1/3 x y 维度的 1/2,然后循环查找并保存每个单元格。
我实际尝试处理的数据有 48 个单元格,每个单元格周围有一条模糊的线,创建了一个大小相等的矩形。如果 R 中有一种方法可以让它找到边界并打出理想的单个单元格,但使用尺寸似乎是一个可行的解决方案。
谢谢!
如果您一直都知道您的子图块是规则形状和方形的,那么还有其他 ways/packages 可以创建这些图块。但我认为 raster
包是最好的解决方案,它以一种非常通用、易于理解的方式完成你想要的事情:
m <- matrix(c( .7, .7, .7, .7, .7, .7, .7, .3, .7, .7, .3, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .3, .7, .7, .3, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .3, .7, .7, .3, .7, .7, .7, .7, .7, .7, .7), nrow = 6, ncol=9)
library(raster)
## Construct a raster object from your matrix:
r <- raster(m)
## Build index locations for upper left corners of grid:
i <- seq(1, ncol(r), ncol(r)/3)
j <- seq(1, nrow(r), nrow(r)/2)
indices <- expand.grid(i, j)
## Crop to these grid locations, storing individual cropped
## areas in a list object:
r_out <- lapply(1:nrow(indices), function(x){
crop(r,
extent(r,
indices[x,2], indices[x,2]+nrow(r)/2 - 1,
indices[x,1], indices[x,1]+ncol(r)/3 - 1
)
)
})
## Plot all individual rasters:
par(mfrow=c(2,3))
lapply(r_out, plot)
## Re-mosaic raster objects:
args <- r_out
args['fun'] <- 'mean'
r_out_mos <- do.call(mosaic, args)
par(mfrow=c(1,1))
plot( r_out_mos )
我希望能够将由矩阵组成的光栅图像拆分成单独的 matrix/images,以便我可以比较它们。
举个例子,假设我有这张光栅图像-
library(grid)
m = matrix(c( .7, .7, .7, .7, .7, .7, .7, .3, .7, .7, .3, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .3, .7, .7, .3, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .3, .7, .7, .3, .7, .7, .7, .7, .7, .7, .7), nrow = 6, ncol=9)
grid.raster(m)
我想 "crop" 将其放入 6 个单独的单元格中,将每个单元格保存为自己的矩阵。 我一直在想这可能是基于维度。
d <- dim(m)
然后知道我的单元格都是 x 维度的 1/3 x y 维度的 1/2,然后循环查找并保存每个单元格。
我实际尝试处理的数据有 48 个单元格,每个单元格周围有一条模糊的线,创建了一个大小相等的矩形。如果 R 中有一种方法可以让它找到边界并打出理想的单个单元格,但使用尺寸似乎是一个可行的解决方案。
谢谢!
如果您一直都知道您的子图块是规则形状和方形的,那么还有其他 ways/packages 可以创建这些图块。但我认为 raster
包是最好的解决方案,它以一种非常通用、易于理解的方式完成你想要的事情:
m <- matrix(c( .7, .7, .7, .7, .7, .7, .7, .3, .7, .7, .3, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .3, .7, .7, .3, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .7, .3, .7, .7, .3, .7, .7, .7, .7, .7, .7, .7), nrow = 6, ncol=9)
library(raster)
## Construct a raster object from your matrix:
r <- raster(m)
## Build index locations for upper left corners of grid:
i <- seq(1, ncol(r), ncol(r)/3)
j <- seq(1, nrow(r), nrow(r)/2)
indices <- expand.grid(i, j)
## Crop to these grid locations, storing individual cropped
## areas in a list object:
r_out <- lapply(1:nrow(indices), function(x){
crop(r,
extent(r,
indices[x,2], indices[x,2]+nrow(r)/2 - 1,
indices[x,1], indices[x,1]+ncol(r)/3 - 1
)
)
})
## Plot all individual rasters:
par(mfrow=c(2,3))
lapply(r_out, plot)
## Re-mosaic raster objects:
args <- r_out
args['fun'] <- 'mean'
r_out_mos <- do.call(mosaic, args)
par(mfrow=c(1,1))
plot( r_out_mos )