3

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

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

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

4

2 回答 2

3

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,......所以:无论如何,它都是多平台设计。

于 2012-08-25T00:55:14.287 回答
1

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

    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;
    }
}

希望能帮助到你。

于 2016-12-31T09:54:16.950 回答