Подсчет объектов в двоичном растровом изображении в R

У меня есть растр:

r <- raster(ncol=10, nrow=10)
set.seed(0)
values(r) <- runif(ncell(r))

img1

Из растра я выбираю верхние 10% и меняю на двоичный:

r_10<-r[[1]]>=quantile(r,.90)

img2

В этом подмножестве растра r_10 все зеленые пиксели имеют одинаковое значение 1. Я хотел бы изменить эти значения, идентифицировав пиксели или группы пикселей как объекты и пометив каждый новый объект новым идентификатором. Новый растр должен иметь значения, подобные этому примеру изображения:  img3

Некоторые объекты могут иметь несколько пикселей, и все они должны иметь один и тот же идентификатор объекта (например, номер 8).

Как я могу запрограммировать это в R? Я думал использовать какое-то обнаружение краев или фильтр Собеля, но не могу понять.

Вот аналогичное сообщение, не то же самое, но на Python, и мне нужно чтобы реализовать это в R.

Приветствуются любые альтернативные решения.

что это значит под объектами? Все эти зеленые пиксели имеют значение 1. Когда вы их маркируете, имеет ли значение порядок? Например, можно ли присвоить цифру 1 нижнему пикселю вместо верхнего левого?   —  person kjtheron    schedule 05.03.2021

Я использую термин объект очень свободно. Здесь я просто хочу переклассифицировать группы соседних пикселей на разные значения. Порядок их маркировки значения не имеет. Пока у самого объекта есть свой уникальный ID.   —  person kjtheron    schedule 05.03.2021

См. также:  MySQL ORDER BY FIELD на месяцы
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. kjtheron

    Я уверен, что есть несколько способов ответить на этот вопрос (компьютерное зрение и ГИС). Вот ГИС-решение (найдено здесь) для рассматриваемой проблемы:

    # Create raster data
    r <- raster(ncol=10, nrow=10)
    set.seed(0)
    values(r) <- runif(ncell(r))
    
    # Select top 10% of highest values and convert to binary
    r_10<-r[[1]]>=quantile(r,.90)
    r_10[r_10==0]<-NA
    
    # Vectorize
    Vector_r_10<-rasterToPolygons(r_10)
    plot(Vector_r_10)
    
    # Add new Obj_ID class
    Vector_r_10$Obj_ID<-1:nrow(Vector_r_10)
    
    # Identify neighboring pixels
    nb<-poly2nb(Vector_r_10)
    
    # Create regions
    create_regions <- function(data) {
      group <- rep(NA, length(data))
      group_val <- 0
      while(NA %in% group) {
        index <- min(which(is.na(group)))
        nb <- unlist(data[index])
        nb_value <- group[nb]
        is_na <- is.na(nb_value)
        if(sum(!is_na) != 0){
          prev_group <- nb_value[!is_na][1]
          group[index] <- prev_group
          group[nb[is_na]] <- prev_group
        } else {
          group_val <- group_val + 1
          group[index] <- group_val
          group[nb] <- group_val
        }
      }
      group
    }
    region<-create_regions(nb)
    
    # Union on new regions
    pol_rgn<-spCbind(Vector_r_10,region)
    New_Vector_r_10<-unionSpatialPolygons(pol_rgn,region)
    New_Vector_r_10<-as(New_Vector_r_10,"SpatialPolygonsDataFrame")
    plot(New_Vector_r_10)
    

    Сейчас это шейп-файл, но для моих целей он подходит. Это всегда можно преобразовать обратно в растр.

    Можно отредактировать параметр snap в poly2nb, чтобы выбрать соседей на соответствующих расстояниях. person kjtheron; 06.03.2021

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: