Stapelverarbeitung von Bildern von Dokumenten, die wie ein Fax aussehen

2364
kdb

Angenommen, ich habe ein Foto oder einen Scan eines Textdokuments, möglicherweise mit einem Hintergrund mit geringem Kontrast zum Wasserzeichen. Wenn es sich um ein Foto handelt, werden zusätzlich zum Wasserzeichen Helligkeitsgradienten von der Beleuchtung und möglicherweise vom Blatt Papier verursacht, das aufgrund von Falten nicht flach liegt.

Ich möchte diese Fotos mit Imagemagick nachbearbeiten, um wie ein Fax auszusehen, dh das Bild in Schwarzweiß umzuwandeln und lokale Helligkeitsunterschiede zu korrigieren. Die normale -thresholdOption wird da nicht funktionieren

  1. Es erkennt nicht automatisch die erforderliche Helligkeit für jedes Foto.
  2. Aufgrund der Helligkeitsgradienten kann der Text in einem Teil des Bildes heller sein als der Hintergrund in einem anderen Teil, so dass bei einem bestimmten globalen Schwellenwert etwas Text verloren geht.

Cam-Scanner-Apps auf Smartphones bieten normalerweise eine Schwarz / Weiß-Dokumentoption, die solche Farbverläufe korrigiert und eine vernünftige erste Schätzung für den Schwellenwert berechnet, der für die Stapelverarbeitung ausreicht.

Sie helfen zwar nicht, wenn ich das Rohbild bereits auf dem PC habe, obwohl ich sie theoretisch auf das Smartphone hochladen und importieren könnte - dies ist gerade für eine große Anzahl von Bildern äußerst unpraktisch.

Unterstützt Imagemagick oder eine andere Batch-Processing-fähige Software (vorzugsweise Open Source) eine solche Konvertierung?

4
Anstatt die Links in der Frage zu bearbeiten, posten Sie sie als separate Antwort oder Kommentar unter der vorhandenen Antwort. Vielen Dank. slhck vor 8 Jahren 0

2 Antworten auf die Frage

5
matthewd

Sie können die mathematischen Kompositionsmethoden von Imagemagick verwenden, um solche Ergebnisse zu erzielen. Divide_src[1] insbesondere da dadurch Farbverläufe, Vignetten und unerwünschte Schattierungen entfernt werden.

Dann sollten ein -normalizeund ein -thresholdden Rest erledigen.

$ input -colorspace gray (+ clone -blur 15,15) -compose Divide_Src -composite -normalize -schwelle 80% $ ausgeben

Hier ist mein Ergebnis:

Möglicherweise möchten Sie den Schwellenwert festlegen, um die besten Ergebnisse zu erzielen.

Abhängig von dem Betriebssystem, das Sie ausführen, müssen Sie möglicherweise die Klammern "\ (" und "\)" deaktivieren.

Für die Stapelverarbeitung persönlich würde ich je nach Betriebssystem entweder in bash oder in Cygwin eine "for" -Schleife verwenden:

für Datei im Test / *; konvertieren Sie $ file -colorspace gray (+ clone -blur 15,15) -compose Divide_Src -composite -normalize -threshold 80% result / `basename $ file`; erledigt

Es gibt jedoch ein anderes Befehlszeilenprogramm, das Sie auschecken können mogrify[2] für die Inline- oder spezifische -pathStapelverarbeitung.

Für weitere Informationen und möglicherweise andere Ergebnisse folgen Sie [3] und [4].


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

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

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

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

Danke für die Antwort. Es scheint zu tun, was ich brauche (Entfernung von Entfärbungen usw.). Jetzt muss ich nur noch eine Methode finden, um schwache Linien (z. B. Bleistiftlinien) lesbarer zu machen (dies wäre jedoch eine separate Frage). kdb vor 10 Jahren 0
Sie können es mit [link] (http://staff.washington.edu/corey/camscan/scancvt) versuchen. Dieses Skript erzeugt zwei Dateien: eine, die eher wie ein Fax (mit "-threshold") und eine, die eine Graustufe (kein reines B & W) ist, und mehr Scan-ähnliches ist (mit Helligkeit und Kontrast durch "-level"). Ich denke, dass Bleistiftlinien bei Graustufen besser sichtbar sind. matthewd vor 10 Jahren 0
Habe es gerade auf meinem beispielbild probiert. In keiner Ausgabedatei ist sogar der gedruckte Text lesbar und die Graustufen-Ausgabedatei ist doppelt so groß wie die Eingabefarbe (beide JPEG). Um ehrlich zu sein, ist das Farbbild eine ziemlich schlechte Farbfotografie, wobei die Bleistiftlinien selbst auf dem Originalbild schwer lesbar sind. kdb vor 10 Jahren 0
Wenn Sie ein Beispiel posten, könnte ich vielleicht etwas einfallen lassen. matthewd vor 10 Jahren 0
2
kdb

Update Aktualisierte Formulare der Skripte werden jetzt als gists gehostet [1] [2]

Basierend auf der Antwort, mein Matthewd, habe ich Skripte geschrieben, die den für Scans vorgesehenen Prozess mit einem angemessenen Kontrast automatisieren. Die Skripte verwenden Poppler pdfimages, ImageMagick convertund pdftk.

imagemagick-scan-pdf-to-mono.sh(Abhängig vom zweiten Skript; Ausgabe kann gedreht werden, was durch Ausführen pdftk FILE.pdf cat 1-endW output OUT.pdfkorrigiert werden kann. Drehrichtung kann geändert werden, indem 1-endEanstelle von verwendet wird. 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 $ is considered unbound if it is empty!  INFILE=$(readlink -m "$")  OUTFILE=$(readlink -m "$") 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 [[ "$" = "-?" ]] || [[ "$" = "-h" ]] || [[ "$" = "--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 "$x$" 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"