R magick 抛出负或零图像大小错误

如何解决R magick 抛出负或零图像大小错误

我正在尝试编写一个迭代的用户指导函数来浏览图像 (PDF) 列表并在对它们运行 OCR/文本识别之前进行调整。其中一个块涉及通过去除噪声、去斑、增强和调整对比度来改善图像。重要的是,相应的 image_xxx 函数中的任何一个都倾向于在每次运行 rsession.exe: NegativeOrZeroImageSize `' @ error/image.c/CloneImage/794随机抛出此错误。我正在运行带有最新版本的 R、magick 及其依赖项的 Windows 10 64 位。谷歌搜索无法提供有关此问题的任何见解。

注意:此处的 while 循环对于让用户返回并更改参数至关重要。我尝试通过使用 tryCatch() 将其封装在 break/next 中来避免破坏流程的错误。我删除函数的所有工作块,并提供了出现问题的部分的可重现示例:

PDF of the scanned page

library(tesseract)
library(magick)
library(dplyr)

img.list <- list(Alabama.pdf)  ### <<< this is a list with many PDFs (in this case just one,linked above)

ocr.manual <- function(img,denoise = T,denoise.rad = 1,despeckle.times = 2,enhance = T,sharpen.factor = 2) {

  img.out <- img[[1]]
  
  if(denoise) {
    # Initial parameters
    proceed.user.input <- 0
    denoise.rad.new.input  <- denoise.rad
    despeckle.times.new.input  <- despeckle.times
    enhance.new.input  <- enhance
    sharpen.new.input  <- sharpen.factor
    
    while(proceed.user.input != 1) {
      img.denoise <- img.out
      skip <- FALSE
      
      repeat {
        tryCatch({
          if(!is.null(denoise.rad.new.input) | denoise.rad.new.input != 0) img.denoise <- image_reducenoise(img.denoise,radius = denoise.rad.new.input)},error = function(e){cat("Error in 'image_reducenouse()':",conditionMessage(e),"\n")},finally = {skip <<- TRUE; break})
      }
      
      if(skip) {next}
      skip <- FALSE
      
      repeat {
        tryCatch({
          if(!is.null(despeckle.times.new.input) | despeckle.times.new.input != 0) img.denoise <- image_despeckle(img.denoise,times = despeckle.times.new.input)},error = function(e){cat("Error in 'image_despeckle()':",finally = {skip <<- TRUE; break})
      }
      
      if(skip) {next}
      skip <- FALSE
      
      repeat {
        tryCatch({
          if(enhance.new.input) img.denoise <- image_enhance(img.denoise)},error = function(e) {cat("Error in 'image_enhance()':",finally = {skip <<- TRUE; break})
      }
      
      if(skip) {next}
      skip <- FALSE
      
      repeat {
        tryCatch({
          if(!is.null(sharpen.new.input) | sharpen.new.input != 0) img.denoise <- image_contrast(img.denoise,sharpen = sharpen.new.input)},error = function(e) {cat("Error in 'image_contrast()':",finally = {skip <<- TRUE; break})
      }
      
      if(skip) {next}

      print(image_ggplot(img.denoise))
      
      ### FOR CONTEXT: THIS PART IS JUST FOR USERS TO CHECK AND ADJUST ParaMETERS,IF NECESSARY
      proceed.user.input <- as.numeric(readline("Please look at the image. Continue? (next step = 1 / try different settings = 2): "))
      
      if(proceed.user.input == 2) {
        denoise.rad.new.input  <- as.numeric(readline("Input denoise smoother radius value in pixels (e.g. 3): "))
        despeckle.times.new.input  <- as.numeric(readline("How many times to run a speckle remover?: "))
        enhance.new.input  <- as.logical(readline("Change whether to enhance the image (T/F,TRUE/FALSE): "))
        sharpen.new.input  <- as.numeric(readline("Sharpness factor (e.g. 1): "))
      }
    }
    # If all cleared,reassign to img.out object to proceed to next step
    img.out <- img.denoise
  }
  
  # OCR
  img.out %>% image_ocr(language = "eng") %>% {. ->> out.text}
  
  return(out.text)
}

# Example of a run
ocr.manual(img = img.list[1])

Error in 'image_despeckle()': rsession.exe: NegativeOrZeroImageSize `' @ error/image.c/CloneImage/794 
Error in 'image_contrast()': rsession.exe: NegativeOrZeroImageSize `' @ error/image.c/CloneImage/794 
Error in magick_image_write_frame(image,format = format,i = i) : 
  rsession.exe: NegativeOrZeroImageSize `' @ error/image.c/CloneImage/794
Called from: magick_image_write_frame(image,i = i)

如果您能帮助我处理(或忽略)错误,我将不胜感激。换句话说,如果其中一个图像增强功能失败,我也可以,只要代码不中断即可。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?