【问题标题】:Extracting code from photograph of T-shirt via OCR通过 OCR 从 T 恤照片中提取代码
【发布时间】:2011-01-25 23:58:10
【问题描述】:

我最近看到有人穿着一件背面印有 Perl 代码的 T 恤。我拍了一张照片,剪掉了代码:

接下来我尝试通过 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 结果?
  • 或者,还有其他人能以其他方式从上图中提取代码吗?

【问题讨论】:

  • 我认为实际上 is 有效 perl...
  • 你可以重新输入。这肯定会更快,因为它似乎是一个一次性的项目。
  • 静一静,这看起来很有趣(谁知道它是否是一次性的?)
  • 有史以来最好的问题!!您为什么不尝试将其发布到biostar.stackexchange.com/questions
  • 呃……那么为什么社区维基警察会查到这个?

标签: python ocr tesseract


【解决方案1】:

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

编辑:错字。

【讨论】:

  • @Paul,输出结果是:又一个基因组黑客。
【解决方案2】:

预处理肯定会产生更实用的图像。

例如,这里是图像上 Gimp “Levels”、“Difference-of-Gaussians”和“Levels”过滤器的结果。

【讨论】:

    【解决方案3】:

    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.
    

    【讨论】:

      【解决方案4】:

      如果我是你,我会首先使用图片处理程序(例如 GIMP)尽可能多地清理图像,这样 OCR 的输入会更容易理解。

      如果可能,尽量只制作黑白图像。

      【讨论】:

        【解决方案5】:

        嗯,也许您需要处理图像,即通过一些过滤器,如“边缘检测”、浮雕/雕刻或噪声过滤器...

        【讨论】:

        • ... 或者更好的是,获得一个真正的 OCR 引擎来为你做这件事。
        • 这只是一个关于如何从“Tesseract”中获得更好结果的建议......我猜在理想的世界中,一个真正的 OCR 引擎每次都能完美运行......@ Otavio,如果您要发表这样的评论,至少建议使用真正的 OCR 引擎... :)
        【解决方案6】:

        良好的 OCR 强烈依赖于自然语言中的冗余,以产生“下一个字符可能是什么”的子集。 Perl 代码没有为 OCR 提供这样的帮助。手动输入。

        【讨论】:

        • 我猜它做了一些转录。例如techcuriosity.com/resources/bioinformatics/dna2rna.php
        • Perl 实际上有更具体的约束 - 解析干净并且运行合理。 DNA 螺旋只使用 4 个字符和一个空格。所以这很容易,只要有正确的解析器集成。
        【解决方案7】:

        像这样的任务的关键是利用明显的限制。找到一个可以让您指定自己的字符集的库。要求主 DNA 螺旋中的所有字符都是 A T G C 之一。要求整个事物解析为 perl。如有必要,手动输入硬部分。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多