PIL+OCR

Alejandro Bermudez Aragurz abermudez en hispasec.com
Lun Nov 3 10:15:22 CET 2008


lopz escribió:
> Hola []
>
> Se me a dado por preguntar algo que me está rompiendo la cabeza xD
> (tampoco es que sea muy pensandor)
> pero suelo ahogarme en un vaso de agua... bueno directo al problema:
>
> Resulta me puse a aprender a usar la librería PIL y para eso estaba
> queriendo hacer un pequeño OCR
> bueno, lo que tenía en mente era esto y pensaba plasmarlo a código
> pero me trabé xD:
>
> Hagamos de ejemplo que tenemos una i en una imágen de 3x7 osea la i
> estaría en el medio, el palo larguito tendría 3 px, y el punto 1, osea
> 5 pixeles separados por un blanco (el que divide el palo del punto)
>
> -Primero, abrir la imágen, si es a colores pues pasarlo a blanco y
> negro todo (en esto he tenido problema)
> quedaría una imagen limpia, RGB puro (0, 0, 0) y (255, 255, 255)
> - Ahora toca recorrer pixel a pixel la imágen, con 2 bucles lo he logrado,
> - Cargar una matrix con los pixeles de otra imagen igual de 3x7 donde
> hayamos hecho todos los anteriores pasos (la idea es hacer 27 matrix's
> para cada letra, para empezar vale)
> - Aquí tenía que comparar comparar la matrix de la nueva imagen con
> alguna de las otras 27, (esto no he logrado, pero puede que tarde
> mucho, y peor si es grande la imágen)
> - En la comparación pensaba comparar así el pixel 0,0 de la img con el
> 0,0 de la matrix anteriormente hecha, si era True, meter un 0, pero si
> era false un 1, pero aquí el problema
> ya que basta que 1 si UN pixel no sería igual para que de False, e iba
> a dar que no es esa letra, entonces he aquí el dilema... ¿Cómo puedo
> comparar ambos matrixs?
> claro, la idea habría sido esta: poner 0 si es igual los pixeles
> y..... poner una X cantidad de acuerdo a cuanta es la deferencia entre
> pixeles comparados, osea que comparando con las 27 matrix la correcta
> sería la que Menos errores se a encontrado a comparlas
>
> creo que eso es todo, aquí esto, queriendo hacer esto pero que no se
> me ocurre nada, también había pensado recorrer el pixel comparado de
> forma espiral pero creo que estoy loco xD
>
> Ya he leído algo de redes neurales y algo interesante en este blog [1]
> que por cierto está interesante :p
> quiero hacer algo así pero.. menos complicado jeje no creo que sea tan
> difícil no??
>
> No pongo código aquí por que es básico lo que he logrado, como he
> dicho anteriormente los pasos que he logrado avanzar pero eso si.. no
> sé si  estará correcto ni en teoría
> si hay otras formas me gustaría saberlas y si ponen ejemplos mucho
> mejor, a ver si logro completar el código lo paso a la lista.
>
> Saludos!
>
>
> [1] http://binsd.wordpress.com/2008/10/16/redes-neuronales-en-python-rna/
>
>   
1. deteccion de bordes (consigue una buena diferenciacion entre el 
caracter y el fondo, aplica algoritmos distintos y utiliza un medidor de 
"calidad de borde" para quedarte con el mejor)
2. segmentacion de caracteres (de un texto completo, coges los 
caracteres individuales, cuidado con el caracter "en blanco" )
3. canonizacion de caracteres (una vez segmentados, todos con el mismo 
tamaño, todos en blanco y negro, etc.)
4. Analisis del caracter (aqui el tema gordo. redes neuronales 
pre-entrenadas y un ajuste fino a posteriori, filtros bayesianos, etc). 
Generalmente un algoritmo estadistico suele bastar ( y es menos costoso 
computacionalmente).
5. generacion del string final (trivial).

cada uno de estos pasos tiene su "mandanga". Hacer un OCR no es algo 
trivial.
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es