Задача о расчете индекса нормализованной разности растительности (NDVI) на изображении (R)

#r #image-processing #matrix #raster

Вопрос:

Я хочу рассчитать количество пикселей, значение которых превышает предел (0,02 в следующем коде) изображения после получения одного индекса NDVI (называемого S в следующем коде). Я пробовал много способов, но это не работает (я уже проверил, что у меня значение ниже 0,02). Используемое изображение: 1: https://i.stack.imgur.com/8HCuZ.jpg

 ## load package
library(raster)
library(oceanmap)
#load satellite image of a park
f <- stack(list.files(path='C:/Users/Desktop/Segmentation', full.names=TRUE))
###################################################
###################################################
b <- brick(f)
###################################################
# obtain the R, G and B layer of the initial image raster
R <- b[[1]]
G <- b[[2]]
B <- b[[3]]
###################################################
#color vegetation indices
S <- (G-B)/(R G B)
> class(S)
[1] "RasterLayer"
attr(,"package")
[1] "raster"
> SumS0 <- as.numeric(sum(S[] < 0.02))
> SumS0
[1] NA
> S1 <- as.matrix(S)
> SumS1 <- as.numeric(sum(S1[] < 0.02))
> class(S1)
[1] "matrix" "array" 
> SumS1
[1] NA
> S2 <- raster2matrix(S)
> SumS2 <- as.numeric(sum(S2[] < 0.02))
> SumS2
[1] NA
> S3 <- as.data.frame(S)
> SumS3 <- as.numeric(sum(S3[] < 0.02))
> SumS3
[1] NA
 

Для случайной матрицы это работает:

 M1<-matrix(rnorm(36),nrow=6)
SumM1 <- as.numeric(sum(M1[] < 0.02))
SumM1
[1] 15
 

введите описание изображения здесь

Комментарии:

1. Может sum(as.numeric(S) < 0.02, na.rm = TRUE) быть.

2. Спасибо, это работает с использованием sum(S[]

Ответ №1:

Ваш алгоритм вычисления NDVI кажется правильным, поэтому я предполагаю, что с вашей реализацией что-то не так. Если я запущу это с помощью ImageMagick, я получу то, что ожидал:

введите описание изображения здесь

Я использовал это в терминале:

 magick 8HCuZ.jpg -fx "((g-b)/(r g b))>0.02 ? 1 : 0" result.png
 

Кстати, качество вашей фотографии (70) довольно низкое и приводит к уродливым артефактам.