tutorial soup find_next_sibling python ocr tesseract

find_next_sibling - python soup find



Extraer código de la fotografía de la camiseta vía OCR (7)

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

Luego intenté extraer el código de la imagen a través de OCR, así que instalé Tesseract OCR y los enlaces de Python para él, pytesser .

Pytesser solo funciona con imágenes TIFF, así que convertí la imagen en Gimp e ingresé 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:

Eso es claramente un alboroto que sale del motor de OCR. Entonces, mi pregunta es:

  • ¿Qué debo hacer para obtener mejores resultados de OCR de Tesseract?
  • O, ¿alguien más tiene mejor suerte extrayendo el código de la imagen anterior de otra manera?

El preprocesamiento definitivamente producirá una imagen más trabajable.

Por ejemplo, aquí está el resultado de los filtros de "Niveles", "Diferencia de Gaussianos" y "Niveles" de Gimp en la imagen.


Hmm, quizás necesite procesar la imagen, es decir, póngala a través de algunos filtros como ''detección de bordes'', relieve / grabado o un filtro de ruido ...


La clave para una tarea como esta es aprovechar las restricciones evidentes. Encuentra una biblioteca que te permita especificar tu propio conjunto de caracteres. Requerir que todos los caracteres en las hélices de ADN principales sean uno de ATG C. Requerir que todo parse como perl. Escriba las partes duras a mano si es necesario.


Los buenos OCR están fuertemente guiados por redundancias en lenguajes naturales para producir un subconjunto para "lo que podría ser el siguiente carácter". El código Perl no otorga tal ayuda al OCR. Escríbelo a mano.


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

Edición: error tipográfico.


Sólo unos pequeños errores tipográficos en el código de 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 cuando se ejecuta produce:

Just another genome hacker.


Si fuera usted, comenzaría por limpiar la imagen lo más posible, utilizando 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.