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

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:
convert coso_de_la_misericordia.jpg -canny 25x25+50%+25% coso_de_la_misericordia_canny_25_0_50_25.jpg
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:

convert coso_de_la_misericordia.jpg -canny 75x100+0%+100% coso_de_la_misericordia_canny_75_100_0_100.jpg

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:

convert coso_de_la_misericordia.jpg -canny 0x25+25%+25% coso_de_la_misericordia_canny_0_25_25_25.jpg

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:

convert coso_de_la_misericordia.jpg -canny 75x75+75%+75% coso_de_la_misericordia_canny_75_75_75_75.jpg

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

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

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:

convert coso_de_la_misericordia.jpg -canny 1x5+1%+5% coso_de_la_misericordia_canny_1_5_1_5.jpg

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

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

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

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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.