计算 R 中二进制光栅图像中的对象
Counting objects in binary raster image in R
我有一个光栅:
r <- raster(ncol=10, nrow=10)
set.seed(0)
values(r) <- runif(ncell(r))
从光栅 I select 前 10% 并更改为二进制:
r_10<-r[[1]]>=quantile(r,.90)
从这个子集栅格 r_10
所有绿色像素都具有相同的值 1。我想更改这些值,方法是将像素或像素组识别为对象并使用新 ID 标记每个新对象.新栅格应具有类似于此示例图像的值:
有些对象可以有多个像素,它们都应该有相同的对象 ID(比如数字 8)。
如何在 R 中对此进行编码?我想使用某种边缘检测或 Sobel 过滤器,但无法弄清楚。
这里有一个类似的,不一样,但是在python中,我需要在R中实现它。
欢迎任何替代解决方案。
我确信有多种方法可以回答这个问题(计算机视觉和 GIS)。这是手头问题的 GIS 解决方案(已找到 here):
# 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)
现在这是一个 shapefile,但就我的用途而言它很好。也可以随时将其转换回光栅。
我有一个光栅:
r <- raster(ncol=10, nrow=10)
set.seed(0)
values(r) <- runif(ncell(r))
从光栅 I select 前 10% 并更改为二进制:
r_10<-r[[1]]>=quantile(r,.90)
从这个子集栅格 r_10
所有绿色像素都具有相同的值 1。我想更改这些值,方法是将像素或像素组识别为对象并使用新 ID 标记每个新对象.新栅格应具有类似于此示例图像的值:
有些对象可以有多个像素,它们都应该有相同的对象 ID(比如数字 8)。
如何在 R 中对此进行编码?我想使用某种边缘检测或 Sobel 过滤器,但无法弄清楚。
这里有一个类似的
欢迎任何替代解决方案。
我确信有多种方法可以回答这个问题(计算机视觉和 GIS)。这是手头问题的 GIS 解决方案(已找到 here):
# 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)
现在这是一个 shapefile,但就我的用途而言它很好。也可以随时将其转换回光栅。