Perfilar los contornos de una imagen con el operador -canny de ImageMagick
Para detectar los contornos con ImageMagick de una manera más precisa que con -edge, tenemos el operador -canny. Es más preciso, pero más complejo, ya que -edge sólo requiere un valor, el radio y -canny una geometría completa (ancho+alto+offset_x%xoffset_y%).
Como esta información no es demasiado clara, pero tampoco es clara la documentación de ImageMagick, veamos una serie de ejemplos para ilustrar el funcionamiento de canny.
Para ello, partiremos de esta imagen:
Si todos los valores están a 0, la imagen que devuelve es totalmente blanca (le añado un borde para que se vea mejor):
convert coso_de_la_misericordia.jpg -canny 0x0+0%+0% -bordercolor red -border 5 coso_de_la_misericordia_canny_0_0_0_0_border.jpg
Lo mismo pasa cuando le indicamos 0% como valor de offset_y. Siempre que le indicamos un 0% en el cuarto parámetro genera una imagen en blanco. En esta y en cualquiera otra imagen.
Si le indicamos 0% en el tercer parámetro (offset_x), lo que genera son manchas blancas y negras que varían en función del resto de parámetros pero genera una imagen que poco tiene que ver con la original:
convert coso_de_la_misericordia.jpg -canny 25x25+0%+25% coso_de_la_misericordia_canny_25_25_0_25.jpg
Genera:
Y con otros valores, como 75×100+0%+100%:
convert coso_de_la_misericordia.jpg -canny 75x100+0%+100% coso_de_la_misericordia_canny_75_100_0_100.jpg
Sigue generando manchas blancas y negras. Mancha distinta, pero que no podemos ni intuir la imagen original:
Por lo tanto, sabemos que si aplicamos 0 a cualquiera de los dos últimos valores, el resultado va a ser una imagen que no se van a ver los bordes de la imagen original.
Veamos qué pasa si le damos un valor de 0 a los dos primeros parámetros. Empezaremos, ya que estamos yendo de derecha a izquiera, por el segundo:
convert coso_de_la_misericordia.jpg -canny 25x0+50%+25% coso_de_la_misericordia_canny_25_0_50_25.jpg
Nos devuelve esta imagen:
En el que podemos intuir a duras penas algún parecido con la imagen original. Pero si le damos un valor de 0 al primer parámetro:
convert coso_de_la_misericordia.jpg -canny 0x25+25%+25% coso_de_la_misericordia_canny_0_25_25_25.jpg
Nos devuelve esta imagen:
De nuevo, vemos poca similitud con la imagen original.
Esto nos podría llevar a pensar que si con 0 en alguno de los valores, el resultado devuelto no es una imagen similar a la original, pero con los bordes perfilados, quizá sí ocurra con valores altos. Probemos con 75 en los cuatro valores:
convert coso_de_la_misericordia.jpg -canny 75x75+75%+75% coso_de_la_misericordia_canny_75_75_75_75.jpg
Nos devuelve:
De nuevo volvemos a ver que el resultado no es una imagen como la original con los bordes marcados.
Así que ya hemos descartado dos cosas, el 0 y valores altos en cualquiera de los parámetros de -canny. Así que sólo nos queda probar con valores bajos distintos a 0:
convert coso_de_la_misericordia.jpg -canny 1x1+1%+1% coso_de_la_misericordia_canny_1_1_1_1.jpg
Esto ya se parece más a la imagen original, aunque quizá con demasiado ruido que podremos modificar con los valores de offset. Veamos qué ocurre si le damos un valor de 5 al cuatro parámetro:
convert coso_de_la_misericordia.jpg -canny 1x1+1%+5% coso_de_la_misericordia_canny_1_1_1_5.jpg
Y ahora, si le damos un valor de 5 al tercer parámetro:
convert coso_de_la_misericordia.jpg -canny 1x1+5%+1% coso_de_la_misericordia_canny_1_1_5_1.jpg
Vemos que el resultado es más elegante con 1 en el tercer parámetro y 5 en el segundo. Ahora probaremos modificando los dos primeros parámetros. De nuevo, y por seguir con el estilo de este artículo, modificaremos el segundo parámetro:
convert coso_de_la_misericordia.jpg -canny 1x5+1%+5% coso_de_la_misericordia_canny_1_5_1_5.jpg
Que nos devuelve:
Y dándole un valor de 5 al primer parámetro:
convert coso_de_la_misericordia.jpg -canny 5x1+1%+5% coso_de_la_misericordia_canny_5_1_1_5.jpg
Vemos que los resultados son muy parecidos. Modificamos los dos primeros valores a la vez:
convert coso_de_la_misericordia.jpg -canny 5x5+1%+5% coso_de_la_misericordia_canny_5_5_1_5.jpg
El resultado también podría ser considerado válido, ya que devuelve una imagen similar a la original, pero con un efecto que puede ser curioso, ya que se parece más a un dibujo hecho a mano alzada. Si queremos realzar más ese efecto, podemos invertir los colores con -negate:
convert coso_de_la_misericordia.jpg -canny 5x5+1%+5% -negate coso_de_la_misericordia_canny_5_5_1_5_negate.jpg
Así que ya casi podemos extraer algunas conclusiones. Pero para ello, mejor si probamos con alguna otra imagen más a ver si nos devuelve resultados similares a los esperados. Probaremos con esta imagen:
Vamos a probar con:
convert museo.jpg -canny 1x5+1%+5% museo_contorno.jpg
Y, ahora, el efecto lápiz:
convert museo.jpg -canny 5x5+1%+5% -negate museo_contorno_a_lapiz.jpg
Y vemos que, aunque cambiemos las imágenes, y que podría hacer falta ajustar los valores en función de las imágenes, de sus zonas sólidas y de la precisión que busquemos, moviéndonos en rangos similares, los resultados son imágenes en los que se ven claramente los contornos de la imagen original.