Detectar archivos de imagen en blanco

8

Estoy usando scanimageun escáner de documentos (Canon DR-2510C) que admite escaneo dúplex. Desafortunadamente, su controlador SANE no admite la detección de páginas en blanco, por lo que con páginas mixtas (una / dos caras), las páginas en blanco entran en el resultado del escaneo.

Me gustaría deshacerme automáticamente de esas páginas en blanco al procesar la salida de escaneo, por lo que estoy buscando una herramienta de línea de comandos que sea capaz de detectar si un archivo TIFF o PNM se compone principalmente de píxeles blancos).

¿Algunas ideas?


Esta es la solución que se me ocurrió en base a la respuesta de lesmana:

for i in "${DEST_DIR}/out"*.pnm; do
  histogram=`convert "${i}" -threshold 50% -format %c histogram:info:-`
  white=`echo "${histogram}" | grep "white" | sed -n 's/^ *\(.*\):.*$/\1/p'`
  black=`echo "${histogram}" | grep "black" | sed -n 's/^ *\(.*\):.*$/\1/p'`
  blank=`echo "scale=4; ${black}/${white} < 0.005" | bc`
  if [ ${blank} -eq "1" ]; then
    echo "${i} seems to be blank - removing it..."
    rm "${i}"
  fi
done
Thilo-Alexander Ginkel
fuente
Pregunta relacionada sobre DSP.SE: detección rápida de página vacía
maxschlepzig

Respuestas:

0

Puede utilizar la herramienta de comparación ImageMagick para comparar las imágenes escaneadas con una página en blanco "maestra". Como mi ImageMagick-fu es bastante limitado, no puedo darle ningún comando de ejemplo. Tendrá que RTFM :

El segundo enlace incluso tiene una sección titulada "Fax en blanco" que explica cómo detectar páginas de fax en blanco. Lamentablemente esa sección parece inacabada. Esperemos que la información disponible sea suficiente para que pueda comenzar.

lesmana
fuente
5

Utilice la función de identificación de ImageMagik CLI como se indica aquí:

http://www.imagemagick.org/script/identify.php

Con comando:

$ identify -format "%#" source.png

Si el número de colores es 1, tiene una página en blanco.

También puedes usar el comando:

identify -verbose source.png

La desviación estándar, sesgo y curtosis será 0 para una imagen en blanco.

amarprabhu
fuente
1
%#devuelve un valor hash calculado para la imagen, debería ser en %kmi humilde opinión.
Nicolai
1

Versión ligeramente mejorada del código en la pregunta:

#!/bin/bash

mkdir -p "blanks"

for i in "$@"; do
    echo "${i}"
    if [[ -e $(dirname "$i")/.$(basename "$i") ]]; then
        echo "   protected."
        continue
    fi

    histogram=$(convert "${i}" -threshold 50% -format %c histogram:info:-)
    #echo $histogram
    white=$(echo "${histogram}" | grep "white" | cut -d: -f1)
    black=$(echo "${histogram}" | grep "black" | cut -d: -f1)
    if [[ -z "$black" ]]; then
        black=0
    fi

    blank=$(echo "scale=4; ${black}/${white} < 0.005" | bc)
    #echo $white $black $blank
    if [ "${blank}" -eq "1" ]; then
        echo "${i} seems to be blank - removing it..."
        mv "${i}" "blanks/${i}"
    fi
done

Cambios:

  • Pase las imágenes para verificar como argumentos en lugar de leer desde una ubicación fija
  • Informe de progreso
  • Si el código no detecta un archivo correctamente, puede darle una pista (cree un archivo vacío con el nombre de la imagen más un punto al frente, es decir, para proteger a.pnm, use touch .a.pnm)
  • Se corrigió el error cuando no había píxeles negros en la entrada
Aaron Digulla
fuente
1

Mi truco es escanear las imágenes a un formato comprimido sin pérdidas (tiff + compresión). De esta manera, las páginas en blanco tienen un tamaño de archivo mucho más bajo y puedo detectarlas find, moverlas a otro directorio, verificarlas rápidamente con un visor y luego deshacerme de ellas.

dwery
fuente
0

Puede hacer un recorte ruidoso con ImageMagick , por ejemplo:

convert image-0001.png -virtual-pixel White -blur 0x15 -fuzz 15% -trim info:

La página no está vacía si convertir imprime algo como esto:

image-0001.png PNG 4565x6129 4960x7016+279+816 8-bit Gray 0.000u 0:00.000

(la entrada de ejemplo es una imagen de lineart escaneada DIN A4 de 600 ppp)

Está vacío si la altura / anchura después del recorte es sospechosamente pequeña, por ejemplo:

image-0001.png PNG 2505x40 4960x7016+0+6976 8-bit Gray 0.000u 0:00.000

A diferencia del método de histograma de umbral, esto produce menos falsos positivos cuando tiene páginas que solo contienen una palabra o una línea de texto. Con un histograma de umbral, tales páginas podrían detectarse erróneamente como vacías.

Mirar el tamaño del archivo de la imagen comprimida, es decir, como una aproximación de la entropía, produce los mismos falsos positivos.

Por otro lado, los documentos con perforaciones pero por lo demás vacíos, probablemente no se detecten como vacíos con solo un recorte ruidoso. Si te interesan esos, puede tener sentido decirle a ImageMagick que primero recorte un poco de margen de forma incondicional. Por ejemplo, si la imagen se escaneó con 600 ppp y desea ignorar un margen de 1 pulgada:

convert i1.png -shave 600x0 -virtual-pixel White -blur 0x15 -fuzz 15% -trim info:
maxschlepzig
fuente