【问题标题】:How to clean an image's text before reading with tesseract?如何在使用 tesseract 阅读之前清理图像的文本?
【发布时间】:2023-03-18 12:30:01
【问题描述】:

我正在使用 tesseract 从图像中读取文本。由于我的 BinaryImage 输入不是纯白色背景上的简单文本,因此我只能得到 50% 的正确输出。

有什么方法可以预处理图像,以便我可以从 tesseract 获得正确的输出?我已经尝试过使用Otsu's method对图像进行灰度缩放和二值化,但没有任何改进。

由于我使用 java 完成所有这些工作,如果有人可以分享任何 java lib 的详细信息或步骤以从 tesseract 中获得更好的结果,那将会很有帮助。

我没有得到适当的 ImageMagick 文档来在我的 Java 代码中使用它。对此的任何帮助表示赞赏。

sample image ( any wireless bill of AT & T)

【问题讨论】:

    标签: java imagemagick ocr tesseract


    【解决方案1】:

    我认为您对账单的扫描分辨率可能太小。我相信如果你有更高分辨率的图像(更大的尺寸)你会得到更好的结果。您也可以尝试以无损压缩格式保存扫描。您可以尝试局部区域阈值。但我认为这对这么小的文字没有帮助。不过,在 ImageMagick 中,您可以使用 -lat 命令来做到这一点。

    convert image.jpg -negate -lat 25x25+10% -negate result.png
    

    根据需要调整值。我还有一个 bash unix shell 脚本 textcleaner,它在其他图像上可能会更好。您可以在http://www.fmwconcepts.com/imagemagick/textcleaner/index.php查看示例

    【讨论】:

    • 感谢您的帮助。我发现了非常好的用于图像处理的 java 库。我现在可以优化输出。我会在我的回答中解释更多。
    【解决方案2】:

    我尝试通过灰度缩放和二值化图像来优化我的输出,但这并没有帮助。然后我尝试boofcv 锐化我的图像,我得到了 90% 的优化输出。

    在锐化图像之前,如果分辨率不够大,我们可以重新缩放图像,使用以下代码:

    public static BufferedImage scale(BufferedImage img, int imageType, int dWidth, int dHeight, double fWidth, double fHeight) {
    BufferedImage img = null;
    if(img != null) {
        img = new BufferedImage(dWidth, dHeight, imageType);
        Graphics2D g = img.createGraphics();
        AffineTransform at = AffineTransform.getScaleInstance(fWidth, fHeight);
        g.drawRenderedImage(img, at);
    }
    return img;
    

    }

    以防万一,有人陷入同样的​​境地。

    【讨论】:

      猜你喜欢
      • 2018-12-23
      • 2018-09-16
      • 1970-01-01
      • 2018-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 2020-11-16
      相关资源
      最近更新 更多