通过OCR从T恤照片中提取代码

我最近看到一个背上有一些Perl代码的T恤衫。 我拍了一张照片,把代码剪掉了:

替代文字

接下来,我试图通过OCR从图像中提取代码,所以我安装了Tesseract OCR和Python绑定pytesser 。

Pytesser只能在TIFF图像上工作,所以我把图像转换成GIMP并input下面的代码(Ubuntu 9.10):

>>> from pytesser import * >>> image = Image.open('code.tif') >>> print image_to_string(image) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "pytesser.py", line 30, in image_to_string util.image_to_scratch(im, scratch_image_name) File "util.py", line 7, in image_to_scratch im.save(scratch_image_name, dpi=(200,200)) File "/usr/lib/python2.6/dist-packages/PIL/Image.py", line 1406, in save save_handler(self, fp, filename) File "/usr/lib/python2.6/dist-packages/PIL/BmpImagePlugin.py", line 197, in _save raise IOError("cannot write mode %s as BMP" % im.mode) IOError: cannot write mode RGBA as BMP >>> r,g,b,a = image.split() >>> img = Image.merge("RGB", (r,g,b)) >>> print image_to_string(img) Tesseract Open Source OCR Engine éi _ l_` _ t ' '" fY` { W IKQW · __·_ ' ·-»· :WZ ·· IA n 1 ;f ` ` `T .' V _ ' I {Z.; » ;,. , ; y i- 4 : %:,, `· » V; ` ? ',—·. H***li¥v·•·}I§¢ ` _ »¢is5#__·¤G$++}§;“»'7· 71 ' Q { NH IQ ytéggygi { ;g¤qg;gm·;,g(g,,3) {3;;+- § {Jf**$d$ }'$p•¢L#d¤ Sc} » i ` i A1: 

这显然是来自OCR引擎的胡言乱语。 所以,我的问题是:

  • 为了从Tesseract中获得更好的OCR结果,我需要做些什么?
  • 或者,其他人有更好的运气从另一个方面提取上述图像的代码?

您可能打字速度比清理图像和安装OCR引擎要快。

 #!/usr/bin/perl (my$d=q[AA GTCAGTTCCT CGCTATGTA ACACACACCA TTTGTGAGT ATGTAACATA CTCGCTGGC TATGTCAGAC AGATTGATC GATCGATAGA ATGATAGATC GAACGAGTGA TAGATAGAGT GATAGATAGA GAGAGA GATAGAACGA TC GATAGAGAGA TAGATAGACA G ATCGAGAGAC AGATA GAACGACAGA TAGATAGAT TGAGTGATAG ACTGAGAGAT AGATAGATTG ATAGATAGAT AGATAGATAG ACTGATAGAT AGAGTGATAG ATAGAATGAG AGATAGACAG ACAGACAGAT AGATAGACAG AGAGACAGAT TGATAGATAG ATAGATAGAT TGATAGATAG AATGATAGAT AGATTGAGTG ACAGATCGAT AGAACCTTTCT CAGTAACAGT CTTTCTCGC TGGCTTGCTT TCTAA CAACCTTACT G ACTGCCTTTC TGAGATAGAT CGA TAGATAGATA GACAGAC AGATAGATAG ATAGAATGAC AGACAGAGAG ACAGAATGAT CGAGAGACAG ATAGATAGAT AGAATGATAG ACAGATAGAC AGATAGATAG ACAGACAGAT AGACAGACTG ATAGATAGAT AGATAGATAG AATGACAGAT CGATTGAATG ACAGATAGAT CGACAGATAG ATAGACAGAT AGAGTGATAG ATTGATCGAC TGATTGATAG ACTGATTGAT AGACAGATAG AGTGACAGAT CGACAGA TAGATAGATA GATA GATAGATAG ATAGACAGA G AGATAGATAG ACA GTCGCAAGTTC GCTCACA ])=~s/\s+//g;%a=map{chr $_=>$i++}65,84,67, 71;$p=join$;,keys%a;while($d=~/([$p]{4})/g ){next if$j++%96>=16;$c=0;for$d(0..3){$c+= $a{substr($1,$d,1)}*(4**$d)}$perl.=chr $c} eval $perl; 

编辑:错字。

预处理一定会产生一个更可行的形象。

例如,下面是图像上的Gimp“级别”,“高斯差异”和“级别”filter的结果。

替代文字FS7oo.gif

只是在RedDwight代码中的几个小错别字。

 #!/usr/bin/perl (my $d=q[AA GTCAGTTCCT CGCTATGTA ACACACACCA TTTGTGAGT ATGTAACATA CTCGCTGGC TATGTCAGAC AGATTGATC GATCGATAGA ATGATAGATC GAACGAGTGA TAGATAGAGT GATAGATAGA GAGAGA GATAGAACGA TC GATAGAGAGA TAGATAGACA G ATCGAGAGAC AGATA GAACGACAGA TAGATAGAT TGAGTGATAG ACTGAGAGAT AGATAGATTG ATAGATAGAT AGATAGATAG ACTGATAGAT AGAGTGATAG ATAGAATGAG AGATAGACAG ACAGACAGAT AGATAGACAG AGAGACAGAT TGATAGATAG ATAGATAGAT TGATAGATAG AATGATAGAT AGATTGAGTG ACAGATCGAT AGAACCTTTCT CAGTAACAGT CTTTCTCGC TGGCTTGCTT TCTAA CAACCTTACT G ACTGCCTTTC TGAGATAGAT CGA TAGATAGATA GACAGAC AGATAGATAG ATAGAATGAC AGACAGAGAG ACAGAATGAT CGAGAGACAG ATAGATAGAT AGAATGATAG ACAGATAGAC AGATAGATAG ACAGACAGAT AGACAGACTG ATAGATAGAT AGATAGATAG AATGACAGAT CGATTGAATG ACAGATAGAT CGACAGATAG ATAGACAGAT AGAGTGATAG ATTGATCGAC TGATTGATAG ACTGATTGAT AGACAGATAG AGTGACAGAT CGACAGA TAGATAGATA GATA GATAGATAG ATAGACAGA G AGATAGATAG ACA GTCGCAAGTTC GCTCACA ])=~s/\s+//g;%a=map{chr $_=>$i++}65,84,67, 71;$p=join$;,keys%a;while($d=~/([$p]{4})/g ){next if$j++%96>=16;$c=0;for$d(0..3){$c+= $a{substr($1,$d,1)}*(4**$d)}$perl.=chr $c} eval $perl; 

当执行时产生:

 Just another genome hacker. 

如果我是你,我会尽可能地用image processing程序(例如GIMP)来清理图像,这样OCR的input将更容易被理解。

如果可能的话,旨在创build一个黑白图像。

嗯,也许你需要处理的图像,即把它通过一些filter,如“边缘检测”,浮雕/雕刻或噪音filter…

良好的OCR受到自然语言冗余的强烈指导,以产生“可能是下一个字符”的子集。 Perl代码对OCR没有这样的帮助。 用手input。

这样的任务的关键是要利用明显的限制。 find一个库,让你指定自己的字符集。 要求主DNA螺旋中的所有字符都是ATG C中的一个字符。要求整个事情以perlparsing。 必要时用手敲入硬件。