Mathematica的TextRecognize表现不佳。

16
请看下面的截图,看看你能否告诉我为什么这样做不起作用。在TextRecognize的参考页面上的示例看起来相当不错。我认为识别这样的单个字母不应该是一个问题。我尝试过调整字母的大小以及让图像变得更清晰。
为方便起见,如果您想自己尝试,请查看本帖子底部使用的图像。您还可以通过在Google图像搜索中搜索“Wordfeud”来找到更多类似的图像。 Mathematica截图 Wordfeud棋盘

你能在描述中更明确地表达这个问题吗?(顺便说一句,我尝试过一次,同意它并不是很好。我没有花太多时间让它工作。也许有趣的是它使用了Teserract - Szabolcs
1
我认为Calle想要检查文本识别功能是否像他怀疑的那样受限。如果不是,他做错了什么?如果是,那么需要什么才能使文本具有高命中率进行扫描? - DavidC
你可能需要使用高分辨率的图像,因为TextRecognize无法识别低于某个阈值的文本。 - Prashant Bhate
3个回答

14

非常棒的问题!

TextRecognize使用启发式算法来识别英语单词。这是使识别单个字母变得非常困难的陷阱。

考虑以下思路:

s = Import["http://i.stack.imgur.com/JHYuh.png"];
p = ImagePartition[s, 32]

现在选择字母组成英语单词“EXIT”:

x = {p[[1, 13]], p[[6, 6]], p[[3, 13]], p[[1, 12]]}

现在稍微清理一下这些图像,就像这样:

d = ImageAssemble[ Map[ImageTake[#, {3, 27}, {2, 20}] &, x ]];

然后这将返回字符串"EXIT":

TextRecognize[d]

Mathematica图形


关于mma试图识别实际单词(默认情况下,英语)而不是单个字母的好点子。这就是为什么我寻找了一份英语填字游戏;我还想要一张黑白图片。似乎当背景不分散注意力时,mma更有可能将一串间隔较大的字母识别为一个单词。 - DavidC
谢谢你们两位的回答。我应该注意到任何未来访问此页面的人,参考页面确实有一个字母随机排序的工作示例。因此,这个不起作用是前两个答案的组合。第三个答案建议使用ImageCorrelate,可以产生可靠的结果。 - C. E.
1
一个特性建议:增加选项以禁用拼写校正,另外还有一个选项可以限制要识别的字符集(我相信TextRecognize的后端Tesseract已经能实现)。这将使读取数字数据更加容易。 - Szabolcs

12

这种方法与使用TextRecognize完全不同,因此我将其发布为单独的答案。它使用与如何在Mathematica中找到Waldo相同的图像识别技术。

首先获取谜题:

wordfeud = Import["http://i.stack.imgur.com/JHYuh.png"]

数学家图形

然后获取拼图的碎片:

Grid[pieces = ImagePartition[s, 32]]

Mathematica graphics

我们来关注字母E:

LetterE = pieces[[4, 3]]

Mathematica graphics

获取相关性图像:

correlation = 
 ImageCorrelate[wordfeud, Binarize[LetterE], 
 NormalizedSquaredEuclideanDistance]

Mathematica graphics

并且突出显示匹配项:

positions = Dilation[ColorNegate[Binarize[correlation, .1]], DiskMatrix[20]];
found = ImageMultiply[wordfeud, ImageAdd[ColorConvert[positions, "GrayLevel"], .5]]

Mathematica graphics

与之前一样,这需要在将相关图像二值化方面进行一些微调,但除此之外,这应该能够帮助识别这个谜题的各部分。


6
我认为您的图像质量可能会影响识别效果。将图像二值化并没有改善情况:识别率几乎为零。我还尝试了一张非常清晰的黑白填字游戏解答图像(见下图)。无论是普通格式还是二值化格式,都无法识别出任何东西。
然后我去掉了黑色背景,只留下了字母和它们的细黑边框。再次识别率约为0%。
当我去掉了一些字母周围的框架并对图像进行了二值化处理后,唯一可识别的部分是除字母外什么也没有的区域(见下图)。
请注意以下输出结果中,ANTS、TIRES 和 TEXAS 被正确识别(以及 VECTORS),但其他几乎没有识别出来。
请注意,即使字符串之间的距离很大,mma 也将它们解释为单词,而不是单独的字母。请注意 "TEXAS" 而不是 "T E X A S"。
TextRecognize[Binarize@img]

(* output *)
ANTS FFWWW FEEWF
E R o If IU I?
E A FI5F WWWFF 5
5552? L E F F
T s E NTT BT|
H0RWW@0WVlWF;EE F
5 W E   ; OCS
FOFT W W R AL%AE
A TT I T ? _
i iE@W'NF WG%S W
A A EW F I i
SWWTW W ALTFCWD N
H A V 5 A F F
PLATT EWWLIGHT
W N E T
HE TIRES C
TEXAS VECTORS

我没有耐心完全清理图像,最快的方法是手动重新输入文本。

结论:除非您有绝对清晰的文本,并且背景均匀明亮(最好是白色),否则不要在mma中使用文本识别。

结果还取决于所使用的文件格式。完全避免使用.pdf格式。



编辑

acl尝试捕获并识别了上面5行文字(编辑前)。他的结果(在下面的评论中):大部分都是无意义的。

我决定也这样做。但由于Prashant警告说字体大小很重要,所以我先放大了文本,使其看起来(在我的眼中)大约为20磅。以下是我扫描和TextRecognize过的文本图片。


text2


以下是未二值化的TextRecognize结果(在那个大尺寸下):

Gliii. Q lk-ii`t`*¥ if EY £\[CloseCurlyDoubleQuote]1\[Euro]'EE \
Di'¥C~E\"P ITF SKI' T»f}!E'!',IL:?E\[CloseCurlyDoubleQuote] I 2 VEEE5\
\[CloseCurlyQuote] LEP \"- \"VE
1. ur e=\\..r.1.»».»\\\\ rw r 1»»\\|a'*r | r .fm -»'-an \
\[OpenCurlyQuote] -.-rr -_.»~|-.'i~-.w~,.-- nv n.w~»-\
\[OpenCurlyDoubleQuote]~"

现在,这是二值图像的文本识别结果。原始图像来自Jing的.png格式。

I didn't have the patience to completely clean up the image. It would \
have been much faster to retype the
text by hand.
Conclusion: Don't use text recognition in mma unless you have \
absolutely clear text against an even-
colored, bright, preferrably white, background.
The results also varied depending on the file format used. Avoid .pdf \
altogether. 

所以,我截取了您帖子的最后5行的屏幕截图(png),并尝试让mma识别它。它说:“”|men[OpenCurlyQuote]\有耐心\e cump\e\e\y清理工资。nweme一直没有太多的|ae\er\e refype the \e><\ ny mane。 cenememn:Dem use \e><\ reeegnmen m mme umess yeu have
ahsu\u\e\y e\ear\e><\ agamm an even- cmured,nngm,prelerramy wrme,naexgreune。 结果,我的resmls mee vanee eepenemg en the me lurmat ueee。Avme .pdf auegemer。”
- acl
以下是有关编程的内容,翻译成中文:(顺便加1分鼓励一下) - acl
尝试在识别文本之前对图像进行“二值化”,看看是否有帮助。 - DavidC
似乎无论我是否按照昨天尝试的相同大小进行裁剪都没有任何区别。也许这与文本的大小有关。 - acl
@acl 你使用的是什么文件格式?即使在大字号下,当我使用.png时,我需要对结果进行“二值化”,尽管文本看起来是黑色的。 - DavidC
可能是与放大倍数有关。等我写完一些代码后再调整它(我现在正在等待代码运行完成时打字)。 - acl

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