¿Cómo recortar automáticamente con Imagemagick conservando un borde pequeño?

¿Cómo recortar automáticamente con Imagemagick conservando un borde pequeño?

Tengo una gran cantidad de archivos que tienen la imagen de una moneda sobre un fondo de fieltro negro. Usando ImageMagick puedo recortar automáticamente estas imágenes usando -trim y -fuzz.

La detección de bordes está funcionando bien, lo que me gustaría encontrar es un parámetro que me permita decir "encontrar el borde pero luego retroceder 10 píxeles", es decir, conservar un perímetro de 10 píxeles alrededor de la moneda en lugar de recortarla directamente. él. No deseo agregar un nuevo borde como con el comando -splice, sino conservar ese espacio de la imagen original.

Hasta ahora no he encontrado una manera de hacerlo, lo más parecido que se me ocurrió es ejecutarlo en modo -trim info:-, capturar el resultado y recalcular el recorte usando un recorte manual, pero realmente preferiría un proceso de un solo paso.

Estoy usando ImageMagick en Windows 10 y, aunque instalé las extensiones de bash, no he probado ningún script, por lo que sería preferible una solución que utilice únicamente la línea de comandos de Imagemagick.

Respuesta1

A falta de una solución elegante, opté por una que funcionara y escribí un script bash sencillo que parece funcionar bien. Esto deja un desplazamiento de 25 píxeles alrededor de la moneda utilizando el gráfico original para proporcionar el fondo. Eventualmente lo parametrizaré y lo limpiaré, pero es el script de trabajo de hoy.

for f in *.jpg; do
    trimbox=$(convert $f -fuzz 25% -format "%@" info:)
    orig=$trimbox
    first=${trimbox%x*}
    trimbox=${trimbox#*x}
    second=${trimbox%%+*}
    trimbox=${trimbox#*+}
    third=${trimbox%+*}
    fourth=${trimbox#*+}
    #echo "trimbox: $orig first: $first second: $second third: $third fourth:$fourth"
    ((first+=50))
    ((second+=50))
    ((third-=25))
    ((fourth-=25))
    trimbox=$first"x"$second"+"$third"+"$fourth
    convert "$f" -crop "$trimbox" +repage "trimmed-$f"
done

Respuesta2

Puedes usar -bordery -bordercolorpara esto; por ejemplo, para un borde transparente, es posible que desees:

for f in *.jpg; do
  convert -fuzz 25% -trim -border 25 -bordercolor none +repage $f trimmed-$f
done

Verhttp://www.imagemagick.org/Usage/crop/#border

información relacionada