【问题标题】:Deskew and filter an image for OCR为 OCR 校正和过滤图像
【发布时间】:2012-08-20 12:06:32
【问题描述】:

我做了很多研究,但没有找到合适的解决方案。我正在编写一个 Android OCR 应用程序。我已经成功加载了 Tesseract 和 Leptonica,并且我正在成功地拍摄和处理图像,并使用 OCR 将它们转换为文本。但是,识别准确率不是很好。

经过多次调整,我们发现我们没有对图像进行足够的过滤、清理和/或纠偏以帮助 Tesseract 进行 OCR 处理。因此,我在互联网上寻找任何对我有用的库或代码,但在 Android 上使用它却无济于事。

有没有人知道图书馆或者可以提供一些代码来帮助我完成这项工作?我想要的只是获取一张位图,将其转换为黑白、纠偏和/或执行一些过滤任务,然后将其提供给 Tesseract,让它使用 OCR 将其转换为文本。

【问题讨论】:

  • 先试试看here

标签: android ocr tesseract


【解决方案1】:

ImageMagick 可以做到这一点。命令行:

convert                              \
    input.{png,pdf,tif,jpeg,gif,...} \
   -colorspace grayscale             \
   -threshold 50%                    \
   -deskew                           \
    output.{png,pdf,tif,jpeg,gif,...}

-colorspace grayscale :还有助于处理彩色输入。
-threshold 50% :使用百分比值 - 但基本上它会转换为黑色 + 白色仅限。
-deskews:去歪斜

但是,我不确定为 Android 平台构建 ImageMagick 的难易程度。它适用于 Linux、Mac OS X、Windows、Solaris、HP-UX……所以:无论如何,它都是多平台设计的。

【讨论】:

  • 谢谢!!我将检查如何将此库移植到 Android 并在此处发布。另外,我发现这个博客对link 很有帮助。还有这个:link.
  • @ManuelOrtizBey:哦,您也可以使用 -convolve kernel(其中 kernel 表示矩阵)来实现与 ImageMagick 相同的效果。
【解决方案2】:

我使用以下方法将图像转换为黑白,这极大地帮助我提高了准确性。

    private Bitmap GetBinaryBitmap(Bitmap bitmap_src) {
    Bitmap bitmap_new = bitmap_src.copy(bitmap_src.getConfig(), true);

    for (int x = 0; x < bitmap_new.getWidth(); x++) {
        for (int y = 0; y < bitmap_new.getHeight(); y++) {
            int color = bitmap_new.getPixel(x, y);
            color = GetNewColor(color);
            bitmap_new.setPixel(x, y, color);
        }
    }

    return bitmap_new;
}


private double GetColorDistance(int c1, int c2) {
    int db = Color.blue(c1) - Color.blue(c2);
    int dg = Color.green(c1) - Color.green(c2);
    int dr = Color.red(c1) - Color.red(c2);

    double d = Math.sqrt(Math.pow(db, 2) + Math.pow(dg, 2) + Math.pow(dr, 2));
    return d;
}

private int GetNewColor(int c) {
    double dwhite = GetColorDistance(c, Color.WHITE);
    double dblack = GetColorDistance(c, Color.BLACK);

    if (dwhite <= dblack) {
        return Color.WHITE;

    } else {
        return Color.BLACK;
    }
}

希望对你有帮助。

【讨论】:

  • 这里更好的解决方案是使用画布和颜色矩阵,这将使用硬件渲染而不是上述使用软件渲染的方法,结果将显着提高速度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 2020-02-24
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多