Detectando arquivos de imagem em branco


8

Estou usando scanimageum scanner de documentos (Canon DR-2510C) que suporta digitalização duplex. Infelizmente, o driver SANE não oferece suporte à detecção de páginas em branco, de modo que, com páginas mistas (frente e verso), as páginas em branco entram no resultado da digitalização.

Gostaria de me livrar automaticamente dessas páginas em branco ao pós-processar a saída da digitalização, por isso estou procurando uma ferramenta de linha de comando capaz de detectar se um arquivo TIFF ou PNM consiste principalmente de pixels brancos).

Alguma ideia?


Esta é a solução que encontrei com base na resposta 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

Questão relacionada no DSP.SE: detecção rápida página vazia
maxschlepzig

Respostas:


0

Você pode usar a ferramenta de comparação do ImageMagick para comparar as imagens digitalizadas com uma página em branco "principal". Como meu ImageMagick-fu é bastante limitado, não posso dar nenhum exemplo de comando. Você terá que RTFM :

O segundo link ainda possui uma seção intitulada "Fax em branco", que explica como detectar páginas de fax em branco. Infelizmente essa seção parece inacabada. Espero que as informações disponíveis sejam suficientes para você começar.


5

Use o recurso de identificação do ImageMagik CLI, conforme indicado aqui:

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

Com o comando:

$ identify -format "%#" source.png

Se o número de cores for 1, você terá uma página em branco.

Você também pode usar o comando:

identify -verbose source.png

O desvio padrão, a inclinação e a curtose serão 0 para uma imagem em branco.


11
%#retorna um valor de hash calculado para a imagem, ela deve ser %kimho.
Nicolai

1

Versão ligeiramente melhorada do código na pergunta:

#!/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

Alterar:

  • Passe as imagens para verificar como argumentos em vez de ler de um local fixo
  • Relatório de progresso
  • Se o código não detectar um arquivo corretamente, você pode dar uma dica (crie um arquivo vazio com o nome da imagem e um ponto na frente, ou seja, para proteger a.pnm, usar touch .a.pnm)
  • Corrigido o erro quando não havia pixels pretos na entrada

1

Meu truque é digitalizar as imagens para um formato sem perdas compactado (tiff + compressão). Dessa forma, as páginas em branco têm um tamanho de arquivo muito menor e eu posso detectá-las find, movê-las para outro diretório, verificá-las rapidamente com um visualizador e depois se livrar delas.


0

Você pode fazer um corte barulhento com o ImageMagick , por exemplo:

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

A página não está vazia se o Convert imprimir algo parecido com isto:

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

(a entrada de exemplo é uma imagem lineart digitalizada de 600 dpi DIN A4)

Está vazio se a altura / largura após o corte for suspeitamente pequena, por exemplo:

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

Ao contrário do método do histograma de limite, isso produz menos falsos positivos quando você tem páginas que contêm apenas uma palavra ou uma linha de texto. Com um histograma de limite, essas páginas podem ser detectadas incorretamente como vazias.

Observar o tamanho do arquivo da imagem compactada, ou seja, como uma aproximação da entropia, produz os mesmos falsos positivos.

Por outro lado, documentos com perfurações, mas vazios, provavelmente não são detectados como vazios apenas com um acabamento barulhento. Se você se preocupa com isso, pode fazer sentido dizer ao ImageMagick para cortar incondicionalmente algum espaço de margem, primeiro. Por exemplo, se a imagem foi digitalizada com 600 dpi e você deseja ignorar uma margem de 1 polegada ao redor:

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.