屏幕截图上的OCR

9
我需要将一张图片转换为文字。但这比看起来要简单些。
我说的这张图片不是扫描后的文档,也不是旋转、倾斜或上下颠倒的图片。它是游戏截图(类似于在记事本中截取文本)。我也知道文字的大小和位置,同时很容易去除背景并变成黑白色。
字体始终保持不变(但我不知道是哪种字体)。所以也许我能训练某个程序来识别这种特定的字体?
我还需要在c#应用程序中调用此功能。因此我正在寻找一种在c#中实现的方法:将位图(或位图路径)提供给我,并返回纯文本结果。
我已经尝试了Tesseract OCR,但似乎我做错了什么,因为结果几乎总是错误的。唯一表现良好的是Capture2Text(只有一个“at”变成“a t”的小错误),但我不知道如何在c#中使用它。
这是一个样例,应该可以读取: http://i.imgur.com/PdEGznk.png

看看这个链接,可能会对你有所帮助...http://stackoverflow.com/a/21496107/3051661 - pankeel
准确的OCR是一个未解决的问题。它在印刷文本上运作得相当合理,这种文本以2400 dpi呈现,并且扫描时不少于600 dpi。屏幕截图通常是96 dpi,由于抗锯齿而故意模糊。如果你的字母只有6个像素高,那么像Capture2Text这样的程序就专门为屏幕截图而设计,因此很可能已经被调整到足够的程度来尝试解决这个问题。但最好不要这样做。 - Hans Passant
4个回答

5
我使用Tesseract.NET来识别您的样本图像,并获得了"Evorvze SWOYG"的结果; 在将其重新缩放到300DPI后,得到了"Bronze sword"。

Tesseract Wiki(FAQImproveQuality)建议使用该分辨率。 - nguyenq
300 dpi是OCR相关图像处理的推荐设置。 - Ilya Evdokimov
更新的链接:常见问题解答提高质量 - dotjpg3141

1
我刚刚添加了将图像放大两倍的代码,它可以完美地识别数字!
Bitmap b = new Bitmap(width * 2, height * 2);
using (Graphics g1 = Graphics.FromImage((Image)b))
{
    g1.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
    g1.DrawImage(newBitmap, 0, 0, width * 2, height * 2);
}

1
我强烈建议不要将分辨率上采样到300 DPI,这会导致很多抖动,对OCR来说不利。一些引擎(如Nuance和ABBYY)足够智能,可以处理72 DPI图像上的字体。
MODI库中的OCR引擎使用的是旧版本的Nuance,比Capture2Text和Tesseract要好得多。

0

这个想法是,每当文件夹中出现新的截图文件时,就对其运行Tesseract OCR并在文件编辑器中打开。

您可以在Linux中使用以下脚本,或者在Windows上使用WSL(Windows上的Ubuntu)。

您可以将此持续运行的脚本留在您最喜欢的屏幕截图输出目录中。

#cat wait_for_it.sh
inotifywait -m . -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
        cd "$path"
        if [ ${file: -4} == ".png" ]; then
                tesseract "$file" "$file"
                sleep 1
                gedit "$file".txt &
        fi

    done

你需要安装这个

sudo apt install tesseract-ocr
sudo apt install inotify-tools

我在Ubuntu上与Shutter一起使用,在Windows上与WSL(Windows上的Ubuntu)和Greenshot一起使用。


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