2010-03-10 10 views
38

Ich sah vor kurzem jemanden mit einem T-Shirt mit etwas Perl-Code auf der Rückseite. Ich habe ein Foto davon und abgeschnitten, um den Code:Code vom Foto von T-Shirt über OCR extrahieren

alt text

Next Ich habe versucht, den Code aus dem Bild per OCR zu extrahieren, so dass ich installierte Tesseract OCR und die Python-Bindings für sie, pytesser.

Pytesser funktioniert nur auf TIFF-Bilder, so konvertiert ich das Bild in Gimp und trat in den folgenden Code (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: 

Das klar ist Kauderwelsch, dass aus dem OCR-Engine kommt. Also, meine Frage ist:

  • Was muss ich tun, um bessere OCR Ergebnisse aus Tesseract zu bekommen?
  • Oder hat jemand anderes mehr Glück, den Code aus dem obigen Bild auf andere Weise zu extrahieren?
+40

Ich denke, dass * eigentlich * gültig ist perl ... – PaulMcG

+3

können Sie es einfach neu eingeben. Das wird sicherlich schneller, da es ein einmaliges Projekt zu sein scheint. – SilentGhost

+4

c'mon still, das sieht nach Spaß aus (und wer weiß, ob es eins ist oder nicht?) – KevinDTimm

Antwort

38

Sie können sich wahrscheinlich schneller geben als Sie Bilder aufzuräumen und OCR-Engines installieren:

#!/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; 

Edit: Tippfehler.

+4

+1 aber du hast das A und das G falsch herum lol –

+1

+1 für die Mühe! : D – kikito

+1

Jetzt funktioniert es. Süß :) – BioGeek

5

Hmm vielleicht müssen Sie das Bild verarbeiten, dh setzen es aber einige Filter wie ‚Kantenerkennung‘, Relief/gravieren oder ein Rauschfilter ...

+0

... oder noch besser: Holen Sie sich eine echte OCR-Engine, die das für Sie erledigt. –

+4

es war nur ein Vorschlag, wie Sie bessere Ergebnisse von 'Tesseract' bekommen könnten ... Ich denke, in einer idealen Welt würde eine REAL OCR-Engine, die immer perfekt funktionierte, den Trick machen ... @Otavio, wenn Ihr Gona einen Kommentar abgeben sollte so, dass zumindest eine echte OCR-Engine vorschlagen ... :) –

+3

Schon damals, zwei gute - Abbyy und Oce '. –

5

Gut OCRs werden durch Redundanzen in natürlichen stark geführt Sprachen, um eine Untermenge für "Was könnte das nächste Zeichen sein" zu erhalten. Perl-Code gibt der OCR keine solche Hilfe. Tippe es von Hand ein.

+0

Ich vermute, dass es eine Transkription tut. z.B. http://www.techcuriosity.com/resources/bioinformatics/dna2rna.php – msw

+0

Perl hat eigentlich viel spezifischere Einschränkungen - sauber zu parsen und vernünftig zu laufen. Und die DNA-Helices verwenden nur 4 Zeichen und ein Leerzeichen. Mit der richtigen Parser-Integration ist das ziemlich einfach. – nealmcb

7

Wenn ich Sie wäre, würde ich damit beginnen, das Bild so weit wie möglich aufzuräumen, indem ich ein Bildbearbeitungsprogramm (zB GIMP) verwende, damit die Eingabe für die OCR leichter verständlich wird.

Wenn möglich, erstellen Sie ein Schwarzweißbild.

15

Vorverarbeitung wird definitiv ein praktikableres Bild ergeben.

Zum Beispiel, hier ist das Ergebnis der Gimp "Levels", "Differenz-von-Gauß" und "Levels" -Filter auf dem Bild.

pre processed image

+0

Der Link zu Ihrem Bild funktioniert nicht. – BioGeek

+0

Hoffentlich korrigiert. –

+0

Jetzt ist es sichtbar. Vielen Dank. – BioGeek

8

Nur ein paar kleine Fehler in RedDwight Code.

#!/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; 

, die bei Ausführung erzeugt:

Just another genome hacker. 
0

Der Schlüssel für eine Aufgabe, wie dies den Vorteil der evident Zwänge zu nehmen. Suchen Sie eine Bibliothek, in der Sie Ihren eigenen Zeichensatz angeben können. Erfordert, dass alle Charaktere in den Haupt-DNA-Helices eine von A T G C sind. Erfordert, dass das Ganze als Perl analysiert wird. Geben Sie die harten Teile bei Bedarf von Hand ein.