如何从图像中提取文本?

如何从图像中提取文本?
我不是在谈论扫描文件,而是普通的图像,比如你在课堂上拍摄黑板的高清照片,上面写得很好;或者当你拍摄食谱书页时,想要将食谱转换为文本格式。
有没有免费开源软件可以做到这一点?
我尝试了tesseract,但结果很糟糕。
5个回答

tesseract-ocr相比其他所有工具都更好。 安装时,请运行以下命令。

sudo apt-get install tesseract-ocr

使用方法是tesseract filename.jpg output.txt,然后它会生成output.txt文件。
您可能需要选择适当的语言。在这种情况下,您需要安装tesseract-ocr-LANG包,其中LANG是三个字母的ISO 639-2语言代码。目前在18.04仓库中有123种语言。例如,可以使用以下命令:
tesseract mySpanishText.jpg output -l spa

1嘿,这个确实可以工作,但不准确,我更愿意说它只有80-85%的准确率。比如对于这张图片:https://pbs.twimg.com/media/DJs6_pcXkAA2VrN.jpg,它弄乱了美元符号和大部分括号。方括号、圆括号、花括号,所有的括号都是问题,无法正确提取。你知道有什么解决方法吗? - Milan Chheda

从图像中提取文本的行为被称为OCR,Ubuntu有一个专门介绍OCR的维基页面OCR。从那个页面上可以看到: 可用的OCR工具 Ubuntu Universe存储库包含以下OCR工具:
  1. gocr - 命令行OCR
  2. fuzzyocr - 用于检查图像附件的spamassassin插件
  3. libhocr0 - 希伯来语OCR
  4. ocrad - 光学字符识别程序
  5. ocrfeeder - 文档布局分析和光学字符识别系统
  6. ocropus - 文档分析和OCR系统
  7. tesseract-ocr
Ubuntu多元宇宙软件源还包含以下内容:
1. cuneiform - 多语言OCR系统
部分软件包已经过时,但可以在Alex_P PPA(PPA添加代码:ppa:alex-p/notesalexp)中找到非官方的最新版本。如果您从未使用过PPA,请查看如何从PPA添加软件
编辑: 正如评论中所示,Clara OCR也存在,但它停留在Hardy版本,并且其网站上的最后更新日期是2009年。

你有使用过我描述的这些例子中的任何一种吗?对于它们,我对常规OCR工具变得有些怀疑了。列表中的第7个就是我尝试过的那个,简直糟糕透了。 - Strapakowsky
如果我没记错的话,我也试过gocr,结果也很糟糕。如果你成功地尝试过其中任何一个,你用的是什么语法?谢谢。 - Strapakowsky
完全没有!我从来不用OCR :D Freshmeat搜索显示Clara OCR和tesseract-ocr ;) (http://freshmeat.net/search/?q=%2BOCR&filter=&filter_scope=&orderby=popularity_percent_DESC) - Rinzwind
如果我说成功使用OCR需要对流程有所了解并进行精心设置以适应特定的扫描图像,那么我错吗?因此,如果我是正确的,糟糕的结果可能是由于用户而非软件造成的。 - N.N.
如果你知道图像是如何创建的,并且对使用你所用的软件非常熟悉,那么OCR的效果会更好(后者是我从未开始使用它的原因)。 - Rinzwind
对于Tesseract和Cuneiform,你可以使用YAGF程序作为GUI。它有一个相当不错的界面,并且可以轻松选择所需图像区域(http://symmetrica.net/cuneiform-linux/yagf.jpg)。正如N.N.所说,有时候问题出在用户而不是软件上 - 也就是说,运行从图像中读取文本的命令可能意味着它会尝试读取整个图像。祝你教会你的计算机阅读愉快。 - Wilf

青蛙

试试青蛙

screenshot

在Ubuntu上使用Flatpak安装:
首先,如果你还没有安装Flatpak,请使用Ubuntu快速入门指南安装Flatpak。记得在安装完成后重新启动系统。
然后,前往Frog on Flathub并点击安装。或者,如果你更喜欢命令行方式,可以运行以下命令进行安装:
``` flatpak install flathub com.github.tenderowl.frog ```

现有的主流仓库中已经存在完全可行的解决方案。我认为这并没有为被接受的答案增添任何内容。最好的情况是重复造轮子,最坏的情况是使用审核较少的非官方仓库安装可能存在安全风险。 - moo
1我已经将负面的投票数归零,因为这是最好的图形用户界面建议,很抱歉花了几年时间才纠正,因为我刚刚看到这个问题,对不起社区中有毒的部分影响到你,坦率地说,如果你不想使用命令行,我认为这是最好的答案。谢谢! - king_below_my_lord
谢谢 @king_below_my_lord。我已经删除了我的评论,因为我觉得它们不再有任何意义。 - Flimm
2023年的替代方案:在Ubuntu 23.04上,先执行sudo apt install zbar-tools,然后再执行sudo snap install frog - NingaCodingTRV
@NingaCodingTRV 为什么要安装 zbar-tools?我已经更新了我的答案,包括一个指向 snap 的链接。 - Flimm
@Flimm 这是一个依赖项,Frog使用它来生成QR码。 - NingaCodingTRV

TextSnatcher

试试TextSnatcher。这个应用程序在幕后使用Tesseract OCR 4.x进行字符识别。

Screenshot

可能在Ubuntu上安装它最简单的方法是从Flathub获取:
首先,如果您还没有安装Flatpak,请使用Ubuntu快速入门指南安装Flatpak。记得在安装完成后重新启动系统。
然后,前往Flathub上的TextSnatcher页面并点击安装。或者,如果您更喜欢使用命令行,可以运行以下命令进行安装:
flatpak install flathub com.github.rajsolai.textsnatcher

我没有给你的回答点踩(而且我也不认为它应该被点踩 - 虽然幸运的是,在你的声誉受到严重侵蚀之前,你还有一些余地!),但我唯一的评论是,在我看来,你的两个回答合并成一个,并提供多个建议会更好,而不是分开的两个回答。 - Will
@Will 有趣,你为什么这么说?如果你想赞同一个建议并反对另一个建议,如果答案合并在一起,你会如何做到这一点?如果你只想阅读关于一个软件的评论,分开发布岂不是更好?AskUbuntu允许同一用户提供多个答案,我认为正是为了像这种情况。 - Flimm
我觉得这是个人偏好;问题是:“我怎样才能做到x”,对我而言,一个好答案应该给出很多选项,以帮助他们决定该做什么。我认为我很少会赞同一个选项并反对另一个选项,但我可能会给那些提供所需选项来做决策的回答点赞。不过,这只是我希望别人回答我的问题时的方式,我并不是回答问题的权威! - Will
1给这个点赞,与青蛙不同,拥有一个基于Tesseract OCR的解决方案可能对某些人来说更可取,两者都是非常出色的选择,我更喜欢青蛙,尽管这个解决方案在手写识别等方面可能表现更好。 - king_below_my_lord

使用tesseract-ocr,我们可以从图像中提取文本。我已经测试了gocr,与tesseract-ocr相比效果不佳。
安装:
sudo apt-get install tesseract-ocr

Python程序,将当前目录中所有扩展名为png的图像文件转换为txt文件。
#!/usr/bin/env python3.10
import os
import subprocess

def list_files(path):
    files = []
    for name in os.listdir(path):
        if os.path.isfile(os.path.join(path, name)):
            files.append(os.path.join(path, name))
    return files

def convertImageToText(img_file):
    #process = subprocess.Popen(['tesseract', img_file,
    #    ''.join(img_file.rsplit('.png', 1))])
    os.system(f"tesseract {img_file} {''.join(img_file.rsplit('.png', 1))}")


def startOperation():
    list_file = list_files(".")
    print(list_file)
    for img_file in list_file:
        if img_file.lower().split(".")[-1] == "png":
            convertImageToText(img_file)

startOperation()