去斜和滤波以进行OCR的图像处理

3

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

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

有人知道任何库或可以提供给我一些代码来协助我完成这个任务吗?我只想取一个位图,将其转换为黑白色,去除倾斜和/或执行一些过滤任务,并将其交给Tesseract,以便使用OCR将其转换为文本。


首先,可以尝试在这里查找:https://www.google.com/search?q=android+image+manipulation+library。 - Robert Harvey
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等平台,因此从设计上来说是跨平台的。


谢谢!我会看看如何将这个库移植到Android并在这里发布。此外,我发现这篇博客非常有帮助[链接](http://android-coding.blogspot.com/2012/05/image-processing-on-android-step-by.html)。还有这个:[链接](http://xjaphx.wordpress.com/learning/tutorials/)。 - Manuel Ortiz Bey
@ManuelOrtizBey:哦,你也可以使用ImageMagick的**-convolve kernel*(其中kernel*代表矩阵)来实现同样类型的效果。 - Kurt Pfeifle

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

希望它有所帮助。

这里更好的解决方案是使用画布和颜色矩阵,这将利用硬件渲染而不是上述使用软件渲染的方法,结果将极大地增加速度。 - Trevor Hart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接