Если ваш вопрос «Мне нужно знать, какой кадр отображается в данный момент», относится к тому, какой кадр в исходном изображении , который использовался для генерации стека с stackObjects
, может просто потребовать отображения кадр в стеке для объектов из маски, используемой для генерации стека. Если так, возможно, этот пример может помочь. Это находит ядра странного размера для отображения в стеке с информацией о кадрах. В этом подходе нет ничего уникального для shiny
.
# Use cell nuclei example from EBImage
library(EBImage)
nuc <- readImage(system.file('images', 'nuclei.tif', package='EBImage'))
# Create nuclear mask
nmask <- thresh(nuc, 10, 10, 0.05)
nmask <- opening(nmask, makeBrush(5, shape = "disc"))
nmask <- fillHull(nmask)
nmask <- bwlabel(nmask)
# Find very small and very large nuclei in each frame
area <- apply(nmask, 3, function(x) table(x[x > 0]))
typical <- lapply(area, function(x) which(x > 150 & x < 750))
mask <- rmObjects(nmask, typical)
# Create stack of oddly sized nuclei
stk <- stackObjects(mask, nuc)
# Determine frame in stack from frame in mask with findInterval
nmax <- apply(mask, 3, max) # note that nuc had 4 frames
index <- c(1, cumsum(nmax))
query_frames <- c(1, 2, 15, 16, 27, 36) # random frames in stack
findInterval(query_frames, index, rightmost.closed = TRUE)
Это сопоставило значения в query_frames
с четырьмя кадрами в исходном nuc-изображении. Вот еще одно применение этого принципа, основанное на используемых здесь объектах.
# Map object in stack to original frame from nuc
dm <- dim(stk) # stack dimension (40 objects)
nobjects <- tail(dm, 1)
idx <- seq_len(nobjects) # index of each frame in stack
frame <- findInterval(idx, index, rightmost.closed = TRUE)
# Visualize with frame label in upper 10% of each panel
nx <- 8
ix <- (idx - 1) %% nx
iy <- (idx - 1) %/% nx
plot(stk, all = TRUE, nx = nx)
text(dm[1]*(ix + 0.1), dm[2] * (iy + 0.1), frame, col = 2, adj = c(0, 1))