如何使用EBImage将本地图像加载到闪亮的应用程序以进行图像分析

时间:2017-08-24 16:12:34

标签: image-processing shiny

我想使用EBImage为图像分析创建一个闪亮的仪表板应用程序。我怀疑的是如何使用EBImage包将局部图像加载到应用程序进行后验分析。

在互联网上,我看到如何从EBImage-package的系统文件加载图像,如下例所示:

library(shiny)
library(EBImage)
library(displayWidget)

# Define UI for application that draws a histogram
ui <- fluidPage(

  # Application title
  titlePanel("Display widget demo"),

  # Sidebar with a select input for the image
  sidebarLayout(
    sidebarPanel(
      selectInput("image", "Sample image:", list.files(system.file("images", package="EBImage")))
    ),

    # Show a plot of the generated distribution
    mainPanel(
      tabsetPanel(
        tabPanel("Static display", plotOutput("display")),
        tabPanel("Interactive widget", displayWidgetOutput("widget"))
      )
    )
  )
)

server <- function(input, output) {

  img <- reactive({
    f = system.file("images", input$image, package="EBImage")
    x = readImage(f)
  })

  output$widget <- renderDisplayWidget({
    displayWidget(img())
  })

  output$display <- renderPlot({
    display(img(), method="raster", all=TRUE)
  })
}

# Run the application
shinyApp(ui = ui, server = server)

我知道如何使用以下方法加载本地数据:

DataXLSX <- reactive({
    inFile <- input$fileXLSX

    if (is.null(inFile))
      return(NULL)

    loadXLSX <- read.xlsx(inFile$datapath)
    loadXLSX    
  })

但我不能对readImage()做同样的事情。一些帮助?谢谢

1 个答案:

答案 0 :(得分:1)

要在您的应用中启用文件上传,您需要替换selectInput("image", ...)窗口小部件,以便通过fileInput控件从预定义的示例文件列表中选择图像,并在响应式表达式中使用其值img访问上传文件的本地副本。您还需要通过调用renderDisplayWidget来保护renderPlotreq(img())中的表达式的执行,以便推迟图像显示,直到选择并加载图像文件。请参阅下面的完整工作示例。 请注意,R包displayWidget提供的功能已集成到EBImage devel分支中,因此从 EBImage 版本4.19开始,加载 displayWidget 已过时0.3。

library("shiny")
library("EBImage")# >= 4.19.3

ui <- fluidPage(

  # Application title
  titlePanel("Image display"),

  # Sidebar with a select input for the image
  sidebarLayout(
    sidebarPanel(
      fileInput("image", "Select image")
    ),

    # Show a plot of the generated distribution
    mainPanel(
      tabsetPanel(
        tabPanel("Static raster", plotOutput("raster")),
        tabPanel("Interactive browser", displayOutput("widget"))
      )
    )
  )

)

server <- function(input, output) {

  img <- reactive({
    f <- input$image
    if (is.null(f))
      return(NULL)        
    readImage(f$datapath)
  })

  output$widget <- renderDisplay({
    req(img())
    display(img())
  })

  output$raster <- renderPlot({
    req(img())
    plot(img(), all=TRUE)
  })

}

# Run the application
shinyApp(ui = ui, server = server)