Определите, какой кадр в настоящее время отображается в EBImage блестящем дисплее - PullRequest
0 голосов
/ 10 апреля 2019

Я написал блестящее приложение, использующее пакет биокондуктора EBImage для выполнения сегментации клеток по изображениям с микроскопа. Затем я могу извлечь сегментированные ячейки как стек изображений с помощью функции stackObjects и отобразить их с помощью функции display.

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

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

Это мой первый пост о переполнении стека, поэтому, извините, если формат этого запроса не идеален. Например, я не уверен, как загрузить файл для использования здесь в качестве входного стека изображений, но я привел базовый пример кода без данных ниже ...

Любая помощь будет принята с благодарностью.

library(shiny)
library(shinydashboard)
library(EBImage)

ui <- dashboardPage(

dashboardHeader(title = 'test display'),

dashboardBody(
    displayOutput('img1', width = '100%', height = '600px')
             )
)

server <- function(input, output, session) {

output$img1 <- renderDisplay({
        display(**Image Stack Here**)
    })

}

shinyApp(ui, server)

1 Ответ

0 голосов
/ 05 мая 2019

Если ваш вопрос «Мне нужно знать, какой кадр отображается в данный момент», относится к тому, какой кадр в исходном изображении , который использовался для генерации стека с 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))
...