Les images de traitement par lot de documents semblent être un fax

Disons que j'ai une photo ou un scan d'un document texte, éventuellement avec un fond de filigrane à faible contraste. Si c'est une photo, en plus du filigrane, il y aura des gradients de luminosité à partir de l'éclairage et éventuellement de la feuille de papier qui ne sera pas aplati par des plis.

Je souhaite postprocesser ces photos avec imagemagick pour ressembler à une télécopie, c'est-à-dire convertir l'image en noir / blanc monochrome en corrigeant les variations locales de luminosité. L'option de -threshold normal ne fonctionnera pas, puisque

  1. Il ne détecte pas automatiquement le niveau de luminosité requis pour chaque photo.
  2. En raison des gradients de luminosité, le texte sur une partie de l'image peut être plus brillant que l'arrière-plan sur une autre partie, de sorte que, pour tout seuil global donné, certains textes seront perdus.

Les applications Cam-Scanner sur les smartphones fournissent généralement une option de document noir / blanc qui corrige ces gradients de couleur et calcule une première estimation raisonnable pour la valeur de seuil, ce qui suffirait pour le traitement par lot.

Ils ne les aident pas quand j'ai déjà l'image brute sur PC, même si je pouvais, en théorie, les télécharger sur le smartphone et les importer, c'est très peu pratique, surtout pour un grand nombre d'images.

Est-ce que imagemagick ou un autre logiciel compatible traitement par lot (de préférence open-source) prend en charge une telle conversion?

Vous pouvez utiliser les méthodes de composition mathématique Imageagick pour obtenir de tels résultats. Divide_src [1] en particulier car il supprime les gradients, les vignettes, les nuances indésirables.

Ensuite, a -normalize et a- -threshold doivent faire le reste.

  Convert $ input -colorspace gray (+ clone -blur 15,15) -composer Divide_Src -composite -normalize -toile 80% $ output 

Voici mon résultat:

Vous voudrez peut-être ajuster le seuil pour obtenir les meilleurs résultats.

Selon le système d'exploitation que vous allez exécuter, vous devrez échapper aux parenthèses: "\ (" et "\)".

En ce qui concerne le traitement par lots personnellement, j'utiliserais une boucle "for" dans bash ou Cygwin à nouveau selon le système d'exploitation:

  Pour fichier en test / *;  Convertir $ fichier -colorspace gris (+ clone -blur 15,15) -composer Divide_Src -composite -normalize -finage 80% résultat / `basename $ file`;  terminé 

Cependant, il existe un autre outil de ligne de commande que vous voudrez peut-être vérifier appelé mogrify [2] pour le traitement par lots en ligne ou spécifique.

Pour plus d'informations et éventuellement différents résultats suivent [3] et [4].


[1]: http://www.imagemagick.org/Usage/compose/#divide

[2]: http://www.imagemagick.org/script/mogrify.php

[3]: staff.washington.edu/corey/camscan/

[4]: http://www.imagemagick.org/Usage/photos/#color-in

La mise à jour des formes mises à jour des scripts sont maintenant hébergées sous la forme de gists [1] [2]

Sur la base de ma réponse, j'ai écrit des scripts qui automatisent le processus comme prévu pour les scans avec un contraste raisonnable. Les scripts utilisent les pdfimages de pdfimages , ImageMagick's convert et pdftk .

imagemagick-scan-pdf-to-mono.sh (dépend du deuxième script; la sortie peut être tournée qui peut être corrigée en exécutant pdftk FILE.pdf cat 1-endW output OUT.pdf . Le sens de rotation peut être modifié en utilisant le 1-endE au lieu de 1-endW )

 #!/usr/bin/env bash # -*- mode: sh; coding: us-ascii-unix -*- # source libstacktrace || true # set -e -u -E MANUAL=" Usage: $0 [options] INPUT OUTPUT Converts a scan-pdf (assuming one image per page) to monochrome. -f INT, --from-page INT Process only pages with page number >= INT -t INT, --to-page INT Process only pages with page number <= INT -P, --parallel INT Process INT pages in parallel each. -v, --verbose / +v, --noverbose Enables/Disables verbose reporting. -h, -?, --help Prints this message " vecho(){ $VERBOSE && echo "$@"; } ######### COMMAND LINE PARSING ####################################### declare VERBOSE=false declare ARGS=() declare PAGE_LIMIT_LOW="" declare PAGE_LIMIT_HIGH="" declare PARALLEL=1 ## Print manual if [[ $# -eq 0 ]]; then echo "$MANUAL" exit 1 fi ## Getopt-style consumption of arguments ## ## ## Don't forget "shift", don't delete "--" and "*" cases. while [[ $# -gt 0 ]]; do case "$1" in -h|-\?|--help) echo "$MANUAL" exit 0 shift ;; -v|--verbose) VERBOSE=true shift ;; +v|--no-verbose) VERBOSE=false shift ;; -f|--from-page) PAGE_LIMIT_LOW="-f $2" shift 2 ;; -t|--to-page) PAGE_LIMIT_HIGH="-l $2" shift 2 ;; -P|--parallel) PARALLEL=$2 shift 2 ;; --) shift break ;; *) ARGS[${#ARGS[@]}]="$1" shift ;; esac done ## Consume stuff remaining after -- ## while [[ $# -gt 0 ]]; do ARGS[${#ARGS[@]}]="$1" shift done ## Note that ${ARGS[@]} is considered unbound if it is empty! INFILE=$(readlink -m "${ARGS[0]}") OUTFILE=$(readlink -m "${ARGS[1]}") TMPDIR=$(mktemp -d) vecho "Using work directory '$TMPDIR'." cd "$TMPDIR" vecho "Extracting images from '$INFILE'..." ## Cannot be parallelized, file-locking issue. cmd="pdfimages -j $PAGE_LIMIT_LOW $PAGE_LIMIT_HIGH $(printf %q "$INFILE") page" # vecho "$cmd" eval "$cmd" || true find -name "page-*" -and -not -name "page-*-mono*" \ | xargs -P $PARALLEL -I FILE sh -c " imagemagick-scan-to-mono.sh FILE FILE-mono.pdf \ && { if $VERBOSE; then echo Finished file 'FILE'; fi; } rm FILE " vecho "Assembling PDF file '$OUTFILE'..." pdftk page-*-mono.pdf cat output out.pdf mv out.pdf "$OUTFILE" rm page-*-mono.pdf rmdir "$TMPDIR" || ls -l 

imagemagick-scan-to-mono.sh

 #!/usr/bin/env bash # -*- mode: sh; coding: us-ascii-unix -*- source libstacktrace || true set -e -u -E MANUAL=" Usage: $0 INFILE OUTFILE Takes a document scan INFILE (an image) and produces a monochromatized output file version. " if [[ "${1:-}" = "-?" ]] || [[ "${1:-}" = "-h" ]] || [[ "${1:-}" = "--help" ]]; then echo "$MANUAL" exit 0 fi BLURRADIUS="20" INFILE="$(readlink -m "$1")" OUTFILE="$(readlink -m "$2")" TMPDIR="$(mktemp -d)" cd "$TMPDIR" convert "$INFILE" -colorspace Gray 01.png convert 01.png -blur "${BLURRADIUS}x${BLURRADIUS}" 02.tif convert 01.png 02.tif -compose Divide_Src -composite 03.tif convert 03.tif -threshold 90% -type bilevel -compress group4 "$OUTFILE" rm 01.png 02.tif 03.tif rmdir "$TMPDIR"