Por qué todo el mundo debería saber programar, razón número 1209487.

Yo siempre digo que todo el mundo debería saber programar. No para "vivir de la programación", sino porque es una herramienta más que te puede servir en muchas ocasiones y ahorrarte laburo. Es como saber usar un martillo, o un serrucho. Todo el mundo debería saber.

Esta es una razón más por la que vuelvo a afirmar lo mismo.

En verdad es un ejemplo de cómo, por saber programar, me ahorré muchas (muchas) horas de trabajo manual.

Hace algunos meses, en una visita a mi viejo, volví a ver (en lo que había sido mi habitación) una caja con álbumes de foto en papel. Fotos sacadas con la "cámara de la familia" que tenían mis viejes, una Olympus de medio cuadro (no recuerdo el modelo) que todavía debe andar por ahí pero entró en desuso con el advenimiento de las cámaras digitales.

Tobi y el mar

Decidí llevarme la caja, aprovechando que el año pasado renové la impresora de casa y ahora tiene scanner, con la idea de digitalizarlas.

La caja durmió varias semanas ahí al lado de la computadora hasta que le llegó el turno entre mis tareas/proyectos.

El paso para digitalizarlas era sencillo. Poner una foto-papel en el scanner, usar xsane para bajar la imagen escaneada, abrirla con gimp, recortar la foto, grabar la foto recortada a disco con un número en el nombre del archivo para tener la secuencia.

Sencillo, pero UN EMBOLE.

Algunas optimizaciones eran obvias: poner de a dos fotos en el scanner, o escanear directemente desde gimp. Pero lo que más llevaba tiempo es que a veces el scanner "falla" (no sé si es el hardware, el driver, o qué, pero simplemente se equivoca de medio de entrada y dice que no tiene para escanear), y obviamente el recortar foto por foto no iba a escalar.

Entonces, como siempre que me enfrento a una ardua tarea manual en la computadora, pensé que se podía automatizar.

Lobos marinos en la Península Valdés

Lo primero, el escaneo propiamente dicho. No encontré cómo hacerlo desde Python, así que lo más sencillo fue ejecutar (via subprocess) el utilitario scanimage con los parámetros adecuados (modo color, resolución 300, etc) lo que ya me deja la imagen "cruda" en disco (a menos que falle, como mencioné arriba, en cual caso la solución es simplemente volver a ejecutarlo).

Lo segundo, recortar las fotos. Eso no es más que "detección de bordes", así que busqué cómo usar OpenCV, que para este tipo de tareas hace MAGIA y tiene buena interfaz con Python. Encontré un ejemplo, lo toqueteé un poco, y listo. No funciona el 100% de los casos, porque en algunos casos se confunde (por ejemplo cuando hay un paisaje: corta por la linea del horizonte como si fuese el borde de la foto), pero es sorprendente lo bien que anda cuando anda :)

Terminé armando un script de linea de comandos (que subí a este proyecto), con la suma de las funcionalidades antedichas. Simple, pero muy útil.

Lago Nahuel Huapi

Cuando se ejecuta, nos pide que pongamos las fotos en el scanner. Luego le damos ENTER y por default escanea, recorta las fotos y las grabar como JPEG con un nombre de archivo armado con el día y la hora y el número de foto dentro de esa "escaneada".

Yo recomiendo tener abierto el directorio donde se ejecuta con algún visor de fotografías, para verlas "aparecer". Si vemos que las fotos están correctas, sacamos las del escaner, ponemos otras y le volvemos a dar ENTER. Pero si vemos que alguna está mal detectada (le faltará algun costado, lo cual nos damos cuenta más por el formato de la foto que por su contenido), le damos R y el script volverá a escanear las fotos pero ahora grabará la imagen "cruda" obtenida: un archivo .pnm que podemos abrir con el gimp y recortarla manual luego.

Con este script terminé procesando todos los álbumes un unas pocas horas de trabajo. Weee.

Ahora me falta procesarlas para corregirles la orientación, agruparlas por "evento" (porque en los álbumes estaban un poco mezcladas), tratar de ubicar en qué fecha fueron tomadas, y a compartirlas con la familia.

Comentarios Imprimir

Luego del PyCamp 2021: Video y supermosaico de imagencitas

Dos subproductos del PyCamp me quedaron para después, y este post es sobre eso.

El video

Le puse mucho, mucho amor al video de Cierre de Actividades.

¡Arranqué con la complejidad de que el audio y el video estaban desfasados! Al principio ni se notaba, pero se iba desfasando con el transcurrir del video y al final estaba un par de segundos corrido, lo cual era insoportable de ver.

Lo mejor que encontré para solucionarlo fue separar el video en sí y el audio del video original, toquetear el audio con audacity y luego usar eso. Quedó bastante bien, pero luego cuando laburé mucho con el video me terminé dando cuenta que el desfasaje no era "lineal" y que en algunas partes iba y venía. Eso lo fui corrigiendo ad-hoc durante la edición, quedó bastante bien pero no perfecto. ‾\_(ツ)_/‾.

Y claro, le puse mucha edición. No sólo una carátula y cortar los tiempos muertos, que es lo básico, sino también tratar de que los pases de un lado para el otro fuesen graduales, hacer zoom sobre las personas y la pantalla en lo posible, acelerar algunas partes que no tenía sentido ver lento, e incluso poner links a los proyectos como subtítulo.

Esos mismos links están en la descripción del video, pero también hay ahí una joyita: separación por capítulos, así que pueden saltar directamente al tema que quieran ver. Esto es más mérito de YouTube que mio, ya que arma esos capítulos automáticamente si uno pone en la descripción los tiempos y títulos. Un lujito.

La foto

Uno de los proyectos que llevé al PyCamp fue el de fotos2imagen. Bah, más que proyecto, lo que llevé fue una idea de proyecto, ya que no sólo no había tirado ni una linea de código, sino que tampoco lo había pensado demasiado (o sea, algo ideal para un PyCamp).

Ya se los había comentado en el post del PyCamp, pero acá les dejo la descripción que puse en el listado de actividades propuestas para el evento:

La idea es armar una imagen pero compuesta por miles de fotitos. Seguro que hay cosas por ahí que hacen algo parecido, pero parte de esto es jugar y aprender. Al programa se le pasa una imagen y un directorio con fotos, y arma la imagen con las fotitos.

Ya en casa, y luego de esperar que les participantes del evento terminen de compartir sus fotos, estuve tratando de armar un mosaico con esas imágenes.

Con "tratando" me refiero a ir jugando con los dos parámetros principales del sistema: el tamaño del cuadradito para recortar la imagen principal, y el tamaño de la imagen que se termina poniendo en ese lugar.

En un momento se me complicó porque para lo que quería lograr el programa tardaba muuuucho, así que decidí hacer algo de profiling y me terminé dando cuenta que lo que se llevaba la mayor parte del tiempo era grabar la imagen que se iba construyendo, lo que se hacía para poder mostrar "un progreso visual" del avance. Entonces toqueté el código para que sólo vaya grabando versiones intermedias si se usaba ese progreso visual, y ahí pude generar versiones más detallistas sin esperar una eternidad.

Al final, la que más me gustó es esta foto-mosaico que pueden comparar con la original:

La imagen original y el mosaico en tamaños similares para comparar

Si abren el mosaico y hacen zoom van a poder ver las fotitos con que está compuesta. Por ejemplo:

Zoom detalle de una parte del mosaico

Obvio que pueden hacer aún más zoom y verlas mejor :)

Si se ponen a jugar con fotos2imagen y hacen algunos mosaicos, ¡avisen y compartan!

Comentarios Imprimir

Procesamiento Paralelo de Vectores

Como parte de la investigación para el libro Python en Ámbitos Científicos que estoy escribiendo con Manuel Carlevaro estoy armando una charla sobre Procesamiento Paralelo de Vectores, que muestra distintas técnicas para hacer eso.

El fuerte del código y las técnicas es en Python, pero también hay una versión "serial" y "paralela" hecha en C++ para tener tiempos "base" contra los cuales comparar.

Para las distintas formas voy a mostrar un poquito de código, y las mediciones (va a haber un slide de cómo se midió, que no es trivial, pero es más "documentación de soporte", no pienso invertir tiempo de la charla ahí).

En paralelo

Si gusta, tengo ganas de dar la charla en algún evento presencial, pero como adelanto con Manu organizamos una charla virtual, ahora en Diciembre. Será el jueves 16 a las 19hs, por Zoom.

Están todos invitades, pero les pedimos por favor que llenen este form para conocer mejor la audiencia de la charla (y potencialmente del libro). Un par de días antes les mandaremos por mail el link para conectarse.

¡Nos vemos!

Comentarios Imprimir