Showing posts with label OCR. Show all posts
Showing posts with label OCR. Show all posts

Saturday, September 05, 2015

Un truco para proteger el software


El 8 de agosto del 2013 publiqué un artículo sobre un programa que hace reconocimiento de caracteres visualmente (OCR), el cual usa una biblioteca de funciones de un tercero, que yo no escribí, sólo usé.

La biblioteca es gratuita pero estaba limitada en tiempo de uso, cosa que no sabía. El asunto es que de pronto mi programa dejó de funcionar. De alguna manera, pensé, la biblioteca tiene por ahí alguna función que sabe en qué momento se instaló el software y entonces calcula si está todavía en período de pruebas o no. Normalmente muchos programas en modo de prueba, que duran muchas veces no más de 30 días, permiten que el interesado pueda revisar, probar y usar el software sin ninguna limitación en ese tiempo. Después del mismo el software ya no se puede ejecutar.

Los esquemas para hacer software de prueba pueden funcionar de la siguiente manera: escribir en el disco duro del usuario, en alguna parte, un archivo escondido con la fecha de terminación del período de prueba. El software, antes de correr, va a buscar ese archivo y lo lee. Si la fecha del sistema ya es mayor a los 30 días, el software termina. Si por alguna eventualidad dicho archivo no existe, también el sistema termina la ejecución.

Hay otros esquemas más sofisticados que escriben en el REGISTRY, un archivo fundamental en la PC que si desaparece, mete en problemas al usuario de la máquina porque probablemente no pueda ver siquiera los programas que tiene en la máquina. Es un archivo muy sensible y ahí muchos fabricantes de software ponen sus claves de registro para conocer si se trata de software de prueba o no. No me voy a meter más con este archivo y recomiendo que si no saben cómo funciona, ni metan las manos ahí. Si lo hacen y cometen un error, es casi garantía que su computadora quedará inutilizada.

Pues bien, regresando al problema, me sorprendía que el ejecutable de mi programa de reconocimiento de caracteres supiera que ya no puede ejecutarse. Pensando un poco sobre esto, hallé que la única manera que podría saber eso era con al fecha de creación del programa escrito. Entonces decidí hacer una prueba: cambiar la fecha del ejecutable por la del día de hoy y probar. ¡Y sorpresa! Funcionó.

Para cambiar la fecha de creación de un programa se usa una utilería llamada touch, la cual cambia automáticamente la fecha del software. La sintaxis es:

touch nombre_del_archivo

Este programa no es de Windows, sino que se corre en modo consola. Como mucha gente no sabe cómo pasar a modo consola, escribí en un archivo batch dos instrucciones que hacen la tarea:

touch ocr01.exe
ocr01

Al darle doble click a este programa .bat, el sistema cambia la fecha al día de hoy y corre el software sin problemas. Así pues, asunto solucionado después del uso de un par de neuronas para entender el esquema de protección usado por el autor de la biblioteca de software.

Si alguien cree que hago mal, le sugiero entonces me compre la biblioteca comercial de dicho paquete de OCR y asunto moral solucionado.

Si le interesa este programa, escríbame a morsa@la-morsa.com y se lo mandaré a su correo.

Monday, October 20, 2014

Programación lúdica: Un experimento fallido


Recientemente conseguí una tesis de maestría, de la Universidad de Alberta, en Canadá, la cual habla de un tema que estoy investigando. La tesis se puede descargar directamente en formato PDF del sitio de la mencionada institución. Descubrí que en realidad el PDF es una colección de imágenes, es decir, no es un texto convertido a PDF sino que pareciera que alguien escaneo -quizás página por página- la tesis original y la hace accesible como PDF, aunque investigando un poco más, hallé que no se escaneó, sino que es una imagen microfilmada y pasada a PDF de alguna manera.

La cuestión es que el escaneo de la tesis permite leerla pero, por alguna razón, quedó muy oscura, es decir, cada página muestra las palabras como si estuviesen en “súper-negritas”. Se puede leer, pero cansa, resulta de alguna manera incómodo. Como que el cerebro tiene que esforzarse para entender algunas palabras. Como me empezó a fastidiar esto, pensé que algo se podría hacer, y considerando que de procesamiento de imágenes algo sé, pues he dado este curso por algunos semestres en la Facultad de Ciencias de la UNAM, empecé a buscar qué filtro podría usar para hacer más legible el documento en cuestión.

Se me ocurrió entonces la siguiente idea: tomar cada página del texto, como una imagen JPG y procesarla con un filtro aún por determinar. El primer problema era cómo pasar un archivo PDF a imágenes. Sorpresivamente hallé que más de uno ha tenido esta necesidad y hay algunos programas que funcionan de manera gratuita, en línea, que hacen esta tarea. El que hallé muy conveniente es éste, el cual puede procesar un archivo PDF hasta de 25 megabytes. Suficiente, mi archivo era de 3 megas, aproximadamente.

El convertidor me presenta cada una de las hojas procesadas como imágenes, las cuales puedo descargar una por una, pero el propio sistema en línea me crea un archivo comprimido con todas las imágenes creadas. Así me ahorro el dar unos 102 clics para descargar cada imagen (la tesis en cuestión contiene 102 páginas de principio a fin). Una vez con las páginas convertidas a imágenes JPG, me puse a ver qué filtro podía ser el más adecuado. Hallé que probablemente el filtro “máximo” podría hacer la tarea. Este filtro toma una vecindad de 5 x 5 pixeles y calcula los colores en cada uno de ellos. Se halla el más brillante y ése se coloca en el punto de interés, es decir, en el centro de la vecindad de 5 x 5. Esto es básicamente un filtro llamado de “convolución”, el cual permite hacer filtros como los siguientes: hallar bordes, hacer la imagen más difusa, hacerla más precisa, etcétera.

Como todas las imágenes las tenía en una carpeta, escribí un pequeño programa que lee imagen por imagen (de la carpeta que yo especifico), las procesa y me entrega cada una de las imágenes convertidas. Cuando se tienen todas las imágenes convertidas, entonces se hace el proceso inverso, es decir, se suben a una página todas ellas y un programa en línea las convierte en un archivo PDF (también de forma gratuita).


Hice una prueba usando la imagen que venía en donde leí sobre el filtro máximo y parecía convincente. Entonces tomé las imágenes y las empecé a procesar… El proceso es lento, pues cada una de ellas es de unos 1275 x 1650 pixeles. Además, en un afán de ser más eficiente, antes de procesar cada imagen la pasaba a blanco y negro. Hice un par de pruebas ya con las primeras páginas de la tesis a ver cómo funcionaba el asunto y hallé estos resultados: No funcionó. No fue el filtro adecuado… Habrá que buscar otro. Quizás el filtro “Sharpen” sea el correcto. Fue todo este trabajo fue experimento fallido, pero aprendí bastante al programarlo. Esta es otra de las virtudes de la programación lúdica.

Thursday, August 08, 2013

OCR para todos

El reconocimiento óptico de caracteres (OCR por sus siglas en inglés), trata de reconocer letras y palabras a partir de imágenes, de manera que puedan pasar a un sistema que pueda ser manipulado. Por ejemplo, si tuviésemos una hoja de un documento que ha sido escrito a máquina y éste lo pasáramos por un escáner, usando la tecnología del OCR podríamos convertir la imagen del documento en cuestión en texto, el cual ya podríamos manipular fácilmente. Esto -desde luego- nos evitaría gastar tiempo, pues claramente un documento físico, si lo quisiésemos en la computadora como archivo de texto, tendríamos que transcribirlo a mano. Con el OCR esta dificultad desaparece.

El proceso básico del OCR es convertir el texto que aparece en una imagen a un archivo de texto, el cual podrá ser editado y usado como tal por cualquier otro programa, por ejemplo un procesador de palabras. Partimos pues de la imagen de un documento, la cual podría ser muy buena, digamos perfecta, con sólo dos niveles de gris, blanco y negro. Bajo esta premisa, el reconocimiento de caracteres se realiza comparándolos con patrones que contienen todos los posibles caracteres (en un idioma específico). Sin embargo, las imágenes reales que escaneamos con este propósito no son perfectas, por lo el OCR encuentra varias dificultades:

  • El dispositivo que obtiene la imagen puede introducir niveles de grises al fondo que no pertenecen a la imagen original.
  • La resolución de estos dispositivos puede introducir ruido en la imagen, afectando los píxeles que han de ser procesados.
  • La distancia que separa a unos símbolos (letras) de otros, al no ser siempre la misma, puede producir errores de reconocimiento.
  • La conexión de dos o más caracteres por píxeles comunes también puede producir errores.
El programa en funcionamiento 
(usando una imagen escaneada de una cuartilla de la Gaceta UNAM)

Hoy en día muchos de estos problemas han sido resueltos y ya existen componentes y bibliotecas de OCR para los lenguajes de programación más populares. De hecho, me interesé en el tema porque tenía un documento que necesitaba pasar a texto y me daba una pereza extraordinaria teclearlo en la computadora. Así que en lugar de hacer esto, me di a la tarea de ver si podía programar una aplicación que lograra esto. Así entonces, bastaría con escanear las cuartillas del documento en cuestión y entonces las procesaría con mi eventual programa.

Hallé que en Delphi hay varios componentes que pueden hacer esta tarea. Dos de ellos me llamaron la atención. El primero, de una empresa llamada WinSoft, el cual puede instalarse en Delphi 7 y proveer lo que necesito para procesar imágenes y convertirlas a texto y uno más, de una compañía llamada Nicomsoft, el cual se ve mucho mejor, pero es para versiones de Delphi que simplemente ya no tengo. Por ello, me quedé con el primero. Hice algunas pruebas y sorprendentemente el componente (de evaluación), lo hace bastante bien.

Una vez que vio que los resultados funcionaban, me di a la tarea de tratar de hacerlo mejor. Es claro que las imágenes perfectas, de dos tonos de gris, no siempre existen, por lo que decidí utilizar algunas ideas de procesamiento de imágenes para "limpiar" los documentos escaneados y hacer que el componente OCR hiciese la tarea de manera más simple y sencilla, y con mayor precisión.

Agregué así algunos filtros digitales para preprocesar las imágenes (que contienen las cuartillas escaneadas) para entonces después, usar el OCR y quedarme con el documento en modo texto que bueno, probablemente tenga que leer y corregir en algunos casos, pero que me habrá ahorrado mucho tiempo de transcripción es un hecho y bajo esa percepción, creo que es un programa que a más de uno le puede interesar.

A quien lo quiera, pídamelo a morsa@la-morsa.com y se lo enviaré de forma gratuita a su buzón digital a la brevedad.