Я это совершил
Mar. 15th, 2006 09:00 pmЗадача - имеется директория куда сваливаются отсканированные страницы в формате pgm. С именами вида произведение1.pgm, произведение2.pgm и так далее. Надо из этого получить .djvu файл, содержащий все произведение целиком. Почему-то мне упорно хотелось решить эту задачу исключительно средствами make. Чтобы говоришь ему
а оно само определяет сколько там есть страниц и собирает, конвертируя сначала в pbm, а потом упаковывая cjb2.
Вот что получилось:
make произведение.djvu
а оно само определяет сколько там есть страниц и собирает, конвертируя сначала в pbm, а потом упаковывая cjb2.
Вот что получилось:
%.pbm: %</ font>.pgm
pgmtopbm $+</ b> >$@</ b>
%.djvu: %</ font>.pbm
cjb2 -clean $+ $@
define tmpl
$1.djvu: </ font>$$(patsubst %.pgm,%.djvu,</ b>$$(wildcard $1?.pgm))
djvm -create $$@ $$+
endef
$(foreach</ font> song,$(wildcard *1.pgm),$(eval $(call tmpl,$(song:%1.pgm=%))))
no subject
Date: 2006-03-16 02:32 am (UTC)#!/bin/bash result="$1" name=$(basename "$1" .djvu) for pgm in ${name}*.pgm do nm=$(basename "$pgm" .pgm) pgmtopbm "$pgm" > "$nm".pbm cjb2 -clean "$nm".pbm "$nm".djvu # && rm -f "$nm".pbm done djvm -create "$result" "${name}"?*.djvu # && rm -f "${name}"?*.djvuкак-то так? :-)no subject
Date: 2006-03-16 02:58 am (UTC)И получаем новое качество - make без параметров делает всё, что требуется сделать.
Повторите то же самое на shell-е. С учетом того, что может потребоваться перестроить .djvu-файл при изменении pgm одной страницы.
Кроме того, в приведенном шелловском скрипте нет контоля ошибок (на tcl, кстати, по умолчанию будет), и нету удаления временныйх файлов (а это придется лапсами писать на любом императивном языке)
no subject
Date: 2006-03-16 03:12 am (UTC)список должен был выглядеть так: :-)
no subject
Date: 2006-03-16 03:30 am (UTC)no subject
Date: 2006-03-16 03:47 am (UTC)no subject
Date: 2006-03-16 04:26 am (UTC)no subject
Date: 2006-03-16 03:22 am (UTC)Кстати, это очень полезный пакет получится...
no subject
Date: 2006-03-16 03:29 am (UTC)1. Исправление косого положения листа в сканер. Немножко нетривиальная задачка по обработке изображений. Но OCR-пакеты это как-то делают. Причем даже по-моему clara и gocr умеют, так что есть откуда стянуть код.
2. Подбор правильного порога при преобразовании grayscale изображения в битональное.
3. Кадрирование - задача, видимо, наиболее простая. Нужна в основном ради отказа от preview-сканирования. Сосканировать всё и потом резать в gimp даже руками, намного быстрее чем ждать результатов preview scan.
Вот если эти три вещи пофиксить, то процесс сканирования будет автоматзирован абсолютно. От оператора останется только нажать какую-нибудь кнопку (можно на сканере) когда вкладывается лист, и ввести название произведения (после чего софт должен будет автомагически сбросить номер страницы в 1).
no subject
Date: 2006-03-16 05:05 am (UTC)Правильные сканеры имеют *чёрную* верхнюю крышку. С ней оно просто.
Выравнивание по строчкам делается довольно просто:
Суммируем по горизонтали, получаем функцию у которой мало между строк и много там где строки.
Вычисляем интеграл от нормы её производной. Это резкость. Выбираем такую горизонталь (из диапазона +/-15 градусов, иначе оператор - алкоголик :) , у которой резкость максимальна.
. Для книжек абсолютная точность порога не очень критична, важно чтобы он не менялся от листа к листу. Можно родить отдельную кнопку калибровки, нажимаемую при замене документа.
. preview не надо, надо postview для контроля.
no subject
Date: 2006-03-16 06:04 am (UTC)А насчет функции стоит подумать. К сожалению, в нотном тексте точность будет не абсолютной. Там довольно много всяких вертикальных палок, зато много и сплошных горизонтальных.
no subject
Date: 2006-03-17 04:37 am (UTC)Кончено наверное в принципе возможно её убрать программно..