【问题标题】:How to extract the pixels of a specific color for OCR?如何为 OCR 提取特定颜色的像素?
【发布时间】:2020-11-27 08:52:08
【问题描述】:

我想通过 OCR(可能是 Tesseract)运行一些小图像/精灵并从中提取一个或多个数字,我知道这些数字/单词将具有特定的颜色(假设在嘈杂/彩色背景)。

在阅读有关 OCR 预处理图像的信息时,我认为从图像中删除所有非白色的东西会非常有益。

我同时使用imagemagickvips,但我不知道从哪里开始,使用什么操作以及如何搜索它。

【问题讨论】:

    标签: image-processing imagemagick ocr tesseract vips


    【解决方案1】:

    如果我们制作这样的示例图像:

    magick -size 300x100 xc: +noise random -gravity center -fill white -pointsize 48 -annotate 0 "Hello" captcha.png
    

    然后你可以用黑色填充任何不是白色的东西:

    magick captcha.png -fill black +opaque white result.png
    

    如果你想接受接近白色的颜色为白色,你可以包含一些“fuzz”

    magick captcha.png -fuzz 10% -fill black +opaque white result.png
    

    【讨论】:

      【解决方案2】:

      几个月前有一个关于 libvips tracker 的关于背景去除技术的讨论:

      https://github.com/libvips/libvips/issues/1567

      这是过滤器:

      #!/usr/bin/python3
      
      import sys 
      import pyvips
      
      image = pyvips.Image.new_from_file(sys.argv[1], access="sequential")
      
      # aim for 250 for paper with low freq. removal
      # ink seems to be slightly blueish
      paper = 250
      ink = [150, 160, 170]
      
      # remove low frequencies .. don't need huge accuracy
      low_freq = image.gaussblur(20, precision="integer")
      image = image - low_freq + paper
      
      # pull the ink down
      ink_target = 30
      scale = [(paper - ink_target) / (paper - i) for i in ink]
      offset = [ink_target - i * s for i, s in zip(ink, scale)]
      image = image * scale + offset
      
      # find distance to white of each pixel ... small distances go to white
      white = [100, 0, 0]
      image = image.colourspace("lab")
      d = image.dE76(white)
      image = (d < 12).ifthenelse(white, image)
      
      # boost saturation (scale ab)
      image = image * [1, 2, 2]
      
      image.write_to_file(sys.argv[2])
      

      它去除低频(即纸张褶皱等),扩展对比度范围,在 CIELAB 中找到接近白色的像素并将它们移动到白色,并提高饱和度。

      您可能需要针对您的用例对其进行一些调整。如果您需要更多建议,请发布一些示例图片。

      【讨论】:

        【解决方案3】:

        我不是这方面的专家,但也许尝试将所有 RGB 值低于某个阈值的像素更改为黑色,或者删除它们? 正如我之前提到的,我对这些都不是很了解,但我不明白为什么这不起作用。

        【讨论】:

        • 这是有道理的,但这不适用于其他颜色,对吧?我想避免手动遍历每个像素并根据 RGB 值过滤掉它们
        • 我认为它适用于其他颜色,不过你可能也必须建立一个上限阈值,我想不出一种方法来消除噪音/其他颜色而不这样做逐个像素,尽管可能有 imagemagick、vips 和任何你使用的语言中的工具,以一种我没有想到或学过的不同方式来完成它。
        【解决方案4】:

        如果图像是合成且未压缩的,您可以测试 RGB 值是否严格相等。否则,对 RGB 三元组之间的距离使用阈值(例如欧几里得或曼哈顿)。

        如果您想允许亮度变化但不允许颜色变化,您可以转换为 HLS 并比较 HS。

        【讨论】:

          猜你喜欢
          • 2014-06-21
          • 1970-01-01
          • 2018-05-10
          • 1970-01-01
          • 1970-01-01
          • 2016-02-15
          • 1970-01-01
          • 2013-10-04
          • 1970-01-01
          相关资源
          最近更新 更多