テキストドキュメントの写真またはスキャンがあり、おそらく低コントラストの透かしの背景があるとします。写真の場合、透かしに加えて、照明や、折り目が原因で平らになっていない紙からの明るさの勾配があります。
これらの写真をimagemagickで後処理して、ファックスのように見せたいと思います。つまり、画像をモノクロの白黒に変換して、明るさの局所的な変化を修正します。普通 -threshold
オプションは機能しないため、
スマートフォンのCam-Scannerアプリは通常、そのような色のグラデーションを修正し、バッチ処理に十分なしきい値の妥当な最初の推測を計算する白黒ドキュメントオプションを提供します。
理論的にはスマートフォンにアップロードしてインポートすることはできますが、PCに未加工の画像がある場合は役に立ちません。特に、多数の画像の場合は非常に実用的ではありません。
Imagemagickまたは他のバッチ処理対応ソフトウェア(できればオープンソース)はそのような変換をサポートしていますか?
Imagemagickの数学的作成方法を使用して、このような結果を得ることができます。 Divide_src
[1]特に、グラデーション、ビネット、不要なシェーディングを削除するため。
次に、-normalize
と-threshold
が残りを実行する必要があります。
変換$ input -colorspace grey(+ clone -blur 15,15)-compose Divide_Src -composite -normalize -threshold 80%$ output
これが私の結果です:
最良の結果を得るには、しきい値を調整することをお勧めします。
これを実行するOSによっては、角かっこ「\(」および「\)」をエスケープする必要がある場合があります。
個人的なバッチ処理に関しては、OSに応じて、bashまたはCygwinのいずれかで「for」ループを再度使用します。
テスト中のファイルの場合/ *; $ file -colorspace grey(+ clone -blur 15,15)-compose Divide_Src -composite -normalize -threshold 80%result/`basename $ file`を変換します。完了
ただし、インラインまたは特定の-path
バッチ処理用にmogrify
[2]と呼ばれるチェックアウトしたい別のコマンドラインツールがあります。
詳細および場合によっては異なる結果については、[3]および[4]に従ってください。
[1]: www.imagemagick.org/Usage/compose/#divide
[2]: www.imagemagick.org/script/mogrify.php
Update更新された形式のスクリプトが要点としてホストされるようになりました [1][2]
私のmatthewdの答えに基づいて、適度なコントラストでスキャンを目的としてプロセスを自動化するスクリプトを作成しました。スクリプトは、popplerのpdfimages
、ImageMagickのconvert
、およびpdftk
を使用します。
imagemagick-scan-pdf-to-mono.sh
(2番目のスクリプトによって異なります。出力は回転する場合があります。これはpdftk FILE.pdf cat 1-endW output OUT.pdf
を実行することで修正できます。回転方向は1-endE
の代わりに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"