Создайте список вектора из вектора индексов и растрового изображения - PullRequest
0 голосов
/ 04 мая 2018

У меня есть два растровых изображения. Один со значениями (img), а другой с индексами сегментации (сегментация):

library(raster)

img=raster(t(matrix(c(1,3,1,2,1,11,11,10,NA,NA,2,12,13,14,2,3,1,2,2,1,2,13,NA,12,0,1,2,20,21,2,3,12,13,14,3,2,21,22,21,1,1,2,3,2,2,1,1,NA,NA,1,NA,NA,13,14,NA,NA,27,6,6,5,NA,NA,NA,12,22,28,7,8,5,6,NA,NA,23,24,22,5,NA,NA,5,8,1,2,1,1,2,5,NA,NA,NA,NA,1,2,1,2,2,7,6,5,NA,NA),10,10)))

segmentation=raster(t(matrix(c(1,1,1,1,1,4,4,4,4,4,1,7,7,7,1,5,5,5,5,5,1,7,7,7,1,5,5,6,6,5,1,7,7,7,1,5,6,6,6,5,1,1,1,1,1,5,5,5,5,5,9,9,9,8,8,3,3,3,3,3,9,9,9,8,8,3,3,3,3,3,8,8,8,8,8,3,3,3,3,3,2,2,2,2,2,3,3,3,10,10,2,2,2,2,2,3,3,3,10,10),10,10)))

Мне нужно получить список векторов, в котором каждая строка списка представляет индексы сегмента, содержащие значения NA, а каждый вектор содержит значения изображения.

Я смог сделать это, используя цикл for. Тем не менее, это делает мою обработку очень медленной при использовании больших изображений. Есть способ выполнить это без цикла for или более оптимизированный подход?

segNumber = length(freq(segmentation)[,1]) #obtain the number of segments

NAPixels <- which(is.na(img[])) #pixels that are NA in img

segsWithNA <- vector() #initializing

segsWithNA <- unique(segmentation[NAPixels]) #segmentation index that contains NA

listOfSegmentValues <- list() #initializing

for (i in 1:length(segsWithNA)){ #For each segment that contains NA
    listOfSegmentValues[[i]] = which(segmentation[] == segsWithNA[i])
}

1 Ответ

0 голосов
/ 04 мая 2018

Вот один из вариантов. Все может быть векторизовано. Цикл for не требуется.

library(raster)

# Get the value as a vector, test if the value is NA
NA_value <- is.na(values(img))

# Label the vector with the segment number
names(NA_value) <- values(segmentation)

# Show segment number and the indices of NA
NA_which <- which(NA_value)

NA_which
# 4   4   7   5   5   9   9   8   3   9   9   9   8   8   3   3   3   3  10  10  10  10 
# 9  10  23  48  49  51  52  55  56  61  62  63  71  72  77  78  87  88  89  90  99 100

# Split to a list
split(NA_which, f = names(NA_which))
# $`10`
# 10  10  10  10 
# 89  90  99 100 
# 
# $`3`
# 3  3  3  3  3 
# 56 77 78 87 88 
# 
# $`4`
# 4  4 
# 9 10 
# 
# $`5`
# 5  5 
# 48 49 
# 
# $`7`
# 7 
# 23 
# 
# $`8`
# 8  8  8 
# 55 71 72 
# 
# $`9`
# 9  9  9  9  9 
# 51 52 61 62 63 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...