Уникальный идентификатор в списке проиндексированных масок 2D / 3D изображения (или 2D / 3D матрицы) в R - PullRequest
0 голосов
/ 26 июня 2019

Я хочу создать «глобальный» идентификатор двумерных / трехмерных ядерных масок в списке изображений.Когда я сегментирую свои ячейки, они нумеруются от 1: numberOfCellsInEachImage.но я хотел бы иметь уникальный идентификатор для каждой ячейки на всех изображениях.

Я уже пытался создать forloop с глобальным счетчиком и назначенными идентификаторами в соответствии со счетчиком, но это стало грязной большой вещью, котораяЯ не доверяю полностью

# minimal exampe
img1 = matrix(data = 0, nrow = 15, ncol = 15)
img1[2:3, 2:3] = 1
img1[9:10, 5:6] = 2
img1[2:4, 11:13] = 3
img1
# Example indexed image 1
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15]
# [1,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
# [2,]    0    1    1    0    0    0    0    0    0     0     3     3     3     0     0
# [3,]    0    1    1    0    0    0    0    0    0     0     3     3     3     0     0
# [4,]    0    0    0    0    0    0    0    0    0     0     3     3     3     0     0
# [5,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
# [6,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
# [7,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
# [8,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
# [9,]    0    0    0    0    2    2    0    0    0     0     0     0     0     0     0
#[10,]    0    0    0    0    2    2    0    0    0     0     0     0     0     0     0
#[11,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
#[12,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
#[13,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
#[14,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
#[15,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
img2 = matrix(data = 0, nrow = 15, ncol = 15)
img2[3:4, 2:4] = 1
img2[10:11, 5:7] = 2
img2[3:5, 11:14] = 3
img2
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15]
# [1,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
# [2,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
# [3,]    0    1    1    1    0    0    0    0    0     0     3     3     3     3     0
# [4,]    0    1    1    1    0    0    0    0    0     0     3     3     3     3     0
# [5,]    0    0    0    0    0    0    0    0    0     0     3     3     3     3     0
# [6,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
# [7,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
# [8,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
# [9,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
#[10,]    0    0    0    0    2    2    2    0    0     0     0     0     0     0     0
#[11,]    0    0    0    0    2    2    2    0    0     0     0     0     0     0     0
#[12,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
#[13,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
#[14,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
#[15,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0

# This is the data structure I have
# 
listOfImages2D = list(img1, img2)
#x = listOfImages2D[[1]]
listOfImages3D = lapply(listOfImages2D, function(x){
  x_out = array(data = 0, dim = c(15, 15, 3) )
  x_out[,,2] = x
  return(x_out)
})
#What I want
# I want all numbers to become an uniqe ID across images
# All zeros should remain zero
# I use img1[img1 == 0 ] = 0 #after giving uniqe IDs
# Image one should ideally start at 1

# ## desired output 
# listOfImages2D_global_index[[1]]
# # same as above
# 
# listOfImages2D_global_index[[2]]
# # [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15]
# # [1,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
# # [2,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
# # [3,]    0    4    4    4    0    0    0    0    0     0     6     6     6     6     0
# # [4,]    0    4    4    4    0    0    0    0    0     0     6     6     6     6     0
# # [5,]    0    0    0    0    0    0    0    0    0     0     6     6     6     6     0
# # [6,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
# # [7,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
# # [8,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
# # [9,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
# #[10,]    0    0    0    0    5    5    5    0    0     0     0     0     0     0     0
# #[11,]    0    0    0    0    5    5    5    0    0     0     0     0     0     0     0
# #[12,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
# #[13,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
# #[14,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
# #[15,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0
# 
# # the code should also work for 3 dimensions

1 Ответ

1 голос
/ 26 июня 2019

Как то так?Немного грубовато, что используется не каждый последующий индекс (в этом случае пропускается 7), но сохраняется относительная разница между значениями в каждом массиве, что может быть полезно.Если вы хотите использовать каждый индекс, это не будет слишком сложно, но замедлит обработку.

z <- 0 # need this to initiate the loop
a <- c(0, 0, 1, 1, 0, 0, 2, 2, 0, 3, 3, 3)
b <- c(0, 3, 3, 3, 0, 2, 2, 2, 0, 0, 0, 0)
g <- c(1, 1, 1, 1, 0, 0, 3, 3, 0, 0, 0, 0)

l <- list(z=z, a=a, b=b, g=g)

# l[-1] <- lapply(l[-1], `dim<-`, c(2, 6))    # 2D 
# l[-1] <- lapply(l[-1], `dim<-`, c(2, 2, 3)) # 3D

for (i in 2:length(l)) {
    lnz <- l[[i]] != 0
#   l[[i]][lnz] <- as.numeric(factor(l[[i]][lnz])) # force successive
    d <- max(l[[i-1]]) - min(l[[i]][lnz])
    l[[i]][lnz] <- l[[i]][lnz] + d + 1
}

l[-1]
# $a
#  [1] 0 0 1 1 0 0 2 2 0 3 3 3
# 
# $b
#  [1] 0 5 5 5 0 4 4 4 0 0 0 0
# 
# $g
#  [1] 6 6 6 6 0 0 8 8 0 0 0 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...