Пакетна обробка зображень документів виглядає як факс


4

Припустимо, у мене є фотографія або сканування текстового документа, можливо, з деякі фону з низьким контрастом водяного знака. Якщо це фото, крім того до водяного знака буде вигляд градієнтів яскравості від освітлення і, можливо, з аркуша паперу, який не укладається плоским через складки.

Я хочу доопрацювати ці фотографії за допомогою imagemagick, щоб виглядати як a перетворення зображення в монохромний чорний / білий виправлення локальних варіацій яскравості. Нормальна -threshold Варіант буде не працює, так як

  1. Він не автоматично визначає необхідний рівень яскравості для кожну фотографію.
  2. Завдяки яскравості градієнти текст на одній частині зображення може бути яскравішим, ніж фон на іншій частині, наприклад, для будь-який заданий глобальний поріг якогось тексту буде втрачено.

Програми Cam-Scanner на смартфонах зазвичай надають чорно-білий документ варіант, який виправляє такі градієнти кольорів і обчислює розумний спочатку вгадайте для порогового значення, що достатньо для партії обробки.

Вони не допомагають, хоча, коли я вже маю необроблене зображення на ПК, хоч я теоретично міг би завантажити їх на смартфон і імпортувати - це просто непрактично, особливо для великої кількості зображень.

Чи є imagemagick або якесь інше програмне забезпечення, здатне до пакетної обробки (бажано з відкритим вихідним кодом) підтримують таке перетворення?


Замість того, щоб редагувати посилання на запитання, розміщуйте їх як окрему відповідь або коментар нижче існуючої відповіді. Дякую.
slhck

Відповіді:


5

Для досягнення таких результатів можна використовувати методи математичного складання Imagemagick. Divide_src [1] зокрема, як би видаляли будь-які градієнти, віньєтки, небажані затінення.

Тоді a -normalize а -threshold треба робити все інше.

convert $input -colorspace gray ( +clone -blur 15,15 ) -compose Divide_Src -composite -normalize -threshold 80% $output

Ось мій результат:

Щоб отримати найкращі результати, можна налаштувати поріг.

Залежно від операційної системи, яку ви збираєтеся запустити, вам, можливо, доведеться уникнути дужок: "(" і "").

Що стосується пакетної обробки особисто я б використовував цикл "за" або в bash або в Cygwin знову в залежності від операційної системи:

for file in test/*; do convert $file -colorspace gray ( +clone -blur 15,15 ) -compose Divide_Src -composite -normalize -threshold 80% result/`basename $file`; done

Однак є інший інструмент командного рядка, який ви можете захотіти перевірити mogrify [2] для вбудованого або специфічного -path Пакетна обробка.

Для отримання додаткової інформації та, можливо, різних результатів [3] та [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


Дякуємо за відповідь. Здається, робити те, що мені потрібно (видалення знебарвлення і т.д.). Тепер мені потрібно лише знайти спосіб, щоб зробити слабкі лінії (наприклад, олівцем) більш читабельними (але це було б окремим питанням).
kdb

Ви можете спробувати посилання . Цей сценарій створює два файли: один з яких є факсом (з -threshold ), а другий - відтінки сірого (не чистий B & W) і більше схожий на сканування (з яскравістю і контрастом через -level ). Я думаю, що лінії олівця будуть більш помітними у шкалі сірого.
matthewd

Просто спробував на своєму прикладі зображення. На жодному з вихідних файлів навіть друкований текст не читається, а вихідний файл у градаціях сірого збільшується в два рази більше, ніж кольоровий вхідний файл (обидва JPEG). Щоб бути справедливим, кольорове зображення - це досить погана кольорова фотографія, а олівцеві лінії важко читати навіть на оригінальному зображенні.
kdb

Якщо ви розмістите приклад, я міг би щось придумати.
matthewd

2

Оновлення Оновлені форми скриптів тепер розміщуються як суть [1] [2]

На підставі відповіді my matthewd я написав сценарії, які автоматизують процес як призначений для сканування з розумним контрастом. Сценарії використовують poppler pdfimages, ImageMagick's convert і pdftk.

imagemagick-scan-pdf-to-mono.sh (залежить від другого сценарію. Вихідні дані можуть бути повернені, які можна виправити за допомогою запуску 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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.