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

41
我最近看到有人穿着一件T恤,上面印着一些Perl代码。我拍了一张照片并裁剪出了代码部分:

alt text

接下来,我尝试通过OCR从图像中提取代码,所以我安装了 Tesseract OCR 和它的Python绑定库 pytesser。Pytesser只能处理TIFF格式的图像,所以我在Gimp中转换了图像,并输入了以下代码(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
  ·  __·_  ‘ ·-»·      
       :W   Z  
  ··  I  A 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结果?
  • 或者,有没有其他人用另一种方式更好地从上面的图像中提取代码的方法?

41
我认为那确实是有效的 Perl 代码... - PaulMcG
3
你可以重新输入它。这肯定会更快,因为它似乎只是一个一次性的项目。 - SilentGhost
4
来吧,沉默,这看起来很有趣(谁知道这是不是一次性的活动呢?) - KevinDTimm
2
有史以来最好的问题!! 为什么不尝试在 http://biostar.stackexchange.com/questions 发布它? - dalloliogm
5
那么,为什么社区维基警察会对这个进行限制呢? - Dave Sherohman
显示剩余3条评论
7个回答

40

你可能打字的速度比清理图像和安装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;

编辑:错别字。


13
@Paul,输出结果是:“只是另一个基因组黑客。” - Nadia Alramli

15

预处理一定会产生一个更易操作的图像。

例如,这是使用Gimp的“级别”、“高斯差分”和“级别”滤镜处理后的图像结果。

预处理后的图像


8
在 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.

7
如果我是你,我会首先使用图片处理程序(例如GIMP)尽可能清理图像,以便OCR的输入更容易理解。如果可能,请尽量创建仅黑白的图像。

5

也许你需要处理这张图片,比如使用一些滤镜,例如“边缘检测”、“浮雕/雕刻”或噪声过滤器...


最好的方法是使用一个真正的OCR引擎来为您完成这项工作。 - Otávio Décio
4
这只是一些建议,关于如何让'Tesseract'获得更好的结果...我猜在理想的世界里,一个真正完美无缺的OCR引擎就可以解决问题了...@Otavio如果你要发表这样的评论,至少提供一个真正的OCR引擎的建议... :) - Chris Moutray

5

优秀的OCR(光学字符识别)通常会利用自然语言中的冗余性,以获得下一个可能的字符子集。Perl代码无法提供这种帮助给OCR,需要手动输入。


我猜它是进行一些转录工作。例如:http://www.techcuriosity.com/resources/bioinformatics/dna2rna.php - msw
Perl实际上有更具体的限制——干净地解析和合理地运行。而DNA螺旋只使用4个字符和一个空格。因此,只要进行正确的解析器集成,这就相当容易。 - nealmcb

1
这样的任务关键在于利用明显的限制。找到一个允许你指定自己字符集的库。要求主要的DNA螺旋中的所有字符都是A T G C之一。要求整个过程解析为Perl。必要时手动输入难点部分。

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