2010-03-10 5 views
38

Recientemente vi a alguien con una camiseta con un código Perl en la parte posterior. Tomé una fotografía de ella y recorté el código:Extrayendo el código de la fotografía de la camiseta a través de OCR

alt text

Después probé para extraer el código de la imagen a través de OCR, por lo que he instalado fijaciones Tesseract OCR y la pitón para ello, pytesser.

Pytesser sólo funciona en imágenes TIFF, lo que convierte la imagen en Gimp y entró en el siguiente código (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: 

Ese galimatías claramente que sale del motor de OCR. Por lo tanto, mi pregunta es:

  • ¿Qué tengo que hacer para conseguir un mejor resultado de OCR de Tesseract?
  • O, ¿alguien más tiene mejor suerte extrayendo el código de la imagen de arriba de otra manera?
+40

Creo que en realidad * es * válido perl ... – PaulMcG

+3

simplemente puede volver a escribirlo. eso ciertamente va más rápido, ya que parece ser un proyecto aislado. – SilentGhost

+4

c'mon en silencio, esto parece divertido (¿y quién sabe si es uno o no?) – KevinDTimm

Respuesta

38

Es probable que pueda escribir más rápido de lo que puede limpiar las imágenes e instalar motores de 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; 

Editar: error tipográfico.

+4

+1 pero tienes la A y la G al revés lol –

+1

+1 por el esfuerzo! : D – kikito

+1

Ahora funciona. Dulce :) – BioGeek

5

Hmm Tal vez usted necesita para procesar la imagen, es decir, ponerlo aunque algunos filtros como 'detección de bordes', relieve/o grabar un filtro de ruido ...

+0

... o mejor aún, obtenga un motor REAL OCR que lo haga por usted. –

+4

fue solo una sugerencia de cómo podrías obtener mejores resultados de 'Tesseract' ... Supongo que en un mundo ideal, un motor REAL OCR que funcionara perfectamente siempre haría el truco ... @Otavio si tu gona hace un comentario así al menos sugiero un motor de OCR REAL ... :) –

+3

Ya entonces, dos buenos - Abbyy y Oce '. –

5

Buenas OCR están fuertemente orientadas por redundancias en naturales idiomas para producir un subconjunto para "lo que podría ser el próximo personaje". El código de Perl no da tal ayuda al OCR. Escríbalo a mano.

+0

Supongo que hace algo de transcripción. p.ej. http://www.techcuriosity.com/resources/bioinformatics/dna2rna.php – msw

+0

Perl en realidad tiene restricciones mucho más específicas: análisis limpio y funcionamiento sensato. Y las hélices de ADN usan solo 4 caracteres y un espacio en blanco. Así que esto es bastante fácil, dada la correcta integración del analizador. – nealmcb

7

Si yo fuera usted, comenzaría por limpiar la imagen tanto como sea posible, usando un programa de manipulación de imágenes (GIMP, por ejemplo) para que la entrada para el OCR sea más fácil de entender.

Si es posible, intente crear una imagen solo en blanco y negro.

15

preprocesamiento definitivamente rendirá una imagen más viable.

Por ejemplo, este es el resultado de los filtros "Niveles", "Diferencia de gaussianos" y "Niveles" de Gimp en la imagen.

pre processed image

+0

El enlace a su imagen no funciona. – BioGeek

+0

Con suerte corregido. –

+0

Ahora está visible. Gracias. – BioGeek

8

sólo unos pequeños errores tipográficos en el código 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; 

que, al ejecutarse produce:

Just another genome hacker. 
0

La clave para una tarea como esta es tomar ventaja de las limitaciones evidentes. Busque una biblioteca que le permita especificar su propio conjunto de caracteres. Requerir que todos los caracteres en las hélices principales de ADN sean uno de A T G C. Requerir que todo el texto se analice como perl. Escriba las partes duras a mano si es necesario.

Cuestiones relacionadas