代码之家  ›  专栏  ›  技术社区  ›  vaibhav Mishra

如何将图像分割为8x8图像块并访问每个块

  •  0
  • vaibhav Mishra  · 技术社区  · 8 年前

    我有一个图像如下。它是256*256像素。让我们假设它的左下角是0,0。从该图像中,我想创建多个图像,如下所示,并将其保存在工作文件夹中。每个图像的大小为8*8像素。每个图像将按其左下角坐标保存。

    光栅图像示例

    library(raster)
    dem <- raster(nrow=256, ncol=256, vals=1:(256*256))
    

    我使用以下代码将图像分割为8*8块

    agg      <- aggregate(raster(dem),fact=c(8,8))
    agg_poly <- rasterToPolygons(agg)
    r_list <- list()
    for(i in 1:ncell(agg)){
        r_list[[i]] <- crop(dem, agg_poly[i,])
    }
    

    如果不使用光栅扫描库,如何在R中完成?

    提前感谢

    2 回复  |  直到 8 年前
        1
  •  2
  •   Robert Hijmans    8 年前

    你可以这样做

    d <- as.matrix(dem)
    ii <- seq(1, nrow(dem), 8)
    jj <- seq(1, ncol(dem), 8)
    r <- list()
    q <- 1
    for (i in ii) {
        for (j in jj) {
            r[[q]] <- d[i:(i+7), j:(j+7)]
            q <- q + 1
        }
    }
    

    具有 可以执行的光栅包(保留光栅层对象):

    d <- dem
    ii <- seq(1, nrow(dem), 8)
    jj <- seq(1, ncol(dem), 8)
    r <- list()
    q <- 1
    for (i in ii) {
        for (j in jj) {
            r[[q]] <- d[i:(i+7), j:(j+7), drop=FALSE]
            q <- q + 1
        }
    }
    
        2
  •  0
  •   vaibhav Mishra    8 年前

    另一种方法

    data = readImage("reSizedDogCatLatest.jpg")
    grayimage<-channel(data,"gray")
    
    CutBySize <- function(m, block.size, nb = ceiling(m / block.size)) {
      int <- m / nb
      upper <- round(1:nb * int)
      lower <- c(1, upper[-nb] + 1)
      size <- c(upper[1], diff(upper))
      df = data.frame()
      df = cbind(lower, upper, size)
      return(df)
    }
    mf = data.frame()
    mf = CutBySize(nrow(grayimage), nb = 32)
    numextract <- function(string){
      str_extract(string, "\\-*\\d+\\.*\\d*")
    }
    final = data.frame()
    libraray(stringr)
    for (i in 1:nrow(mf))
    {
      lower = numextract(mf[i,][1])
      upper = numextract(mf[i,][2])
      for(j in 1:nrow(mf))
      {
        lowerj = numextract(mf[j,][1])
        upperj = numextract(mf[j,][2])
        final = rbind(final,grayimage[lower:upper, lowerj:upperj])
      }
    }