09.02.2010

Улучшение качества DJVU книг

Очень часто попадаются интересные книги в формате djvu. Но к сожалению качество некоторых книг не очень хорошее. К основным дефектам можно отнести:
  • серый фон на страницах;
  • некоторые страницы перевернуты на 90-180 град;
  • страницы идут попарно - разворотами, такие неудобно читать на небольшом экране нетбука.
Как исправить такую книгу расскажу под катом.


Перед началом работы убедитесь, что установлены пакеты:
libtiff-tools, djvulibre-bin и imagemagick.

Итак имеем файл книги inputfile.djvu. Примерно такого качества:

Преобразуем его сначала в многостраничный tiff:
Сжатие без компрессии (размер файла может достичь до нескольких Гб! в зависимости от количества страниц и качества книги)
ddjvu -v -format=tiff inputfile.djvu output.tiff
Сжатие с компрессией (размер файла до 500 Мб)
ddjvu -v -format=tiff -quality=80 inputfile.djvu output.tiff

Если книга небольшая, до 200 стр., то параметр качества -quality=80 можно не указывать, при этом tiff получиться без компрессии, а значит, с меньшей потерей качества при преобразовании. У меня с книгой более 500 стр не получилось разрезать с помощью tiffsplit созданный без компрессии 2 Гб-ый tiff.
Теперь преобразуем многостраничный тиф в множество одностраничных - каждую страницу в отдельный файл:
tiffsplit inputfile.tiff outputdir/
Еще одно преобразование, на этот раз из tiff в png. Для чего? Объясняю чуть ниже.
for f in *; do convert $f png/$f.png; done

Кстати, если нужно сделать djvu файл из отсканированного в FineReader документа, то возникает проблема - tif файлы проекта FineReader многофреймовые. Каждый файл состоит из двух фреймов. Первый фрейм - непосредственно страница, второй - мииатюра. Imagemagick и Scan Tailor не принимают таких файлов. Для того, что бы вытащить полезные страницы из множества многофреймовых tif файлов можно воспользоваться простым однострочным скриптом:

for NAME in *.tif; do convert "$NAME[0]" convert/"$NAME".tiff; echo "Обработан файл '$NAME'"; done

либо (для получения на выходе png файлов)
for NAME in *.tif; do convert "$NAME[0]" convert/"$NAME".png; echo "Обработан файл '$NAME'"; done



На следующем этапе нам понадобиться Scan Tailor - программа для подготовки электронных книг. В Ubuntu 9.10 и в более поздних релизах она есть в репозитории. Для пользователей других дистрибутивов: ищите в своих репозиториях, если нет, то Scan Tailor легко собирается из исходников, предварительно почитайте, что нужно установить по зависимостям. Есть версия для Windows.
sudo apt-get install scantailor

Запускаем Scan Tailor, добавляем все png/tiff файлы в проект и проходим по нужным пунктам оптимизации. Поскольку программа локализована, не вижу смысла подробно останавливаться на всех пунктах оптимизации. Scan Tailor позволяет: исправлять ориентацию страниц, разрезать развороты отсканированных страниц, корректировать угол наклона страниц, выделять полезную область страниц, при этом очищая поля, поменять разрешение документа, выбрать способ компресии для изображения: черно-белое, цветное-оттенки серого, смешанное. Наиболее важный и интересный пункт это "Разрезка страниц". Насколько я знаю, есть еще одна программа для обработки отсканированных изображений под nix системы, позволяющая разрезать развороты книг - unpaper. Однако добиться ее корректной работы у меня не получилось (страницы не резались, если кто то работает с unpaper оставьте в коментах рабочие опции при разрезании разворотов страниц). Наилучший, самый чистый результат получается при выборе в пункте "Вывод" режима "Черно-белый". Однако этот способ коррекции не подходит, если в книге есть фотографии, тут нужно подбирать режим: "Цветной-серый" либо "Смешанный".
После завершения работы результаты складываются в папку "out".
В консоли переходим в папку out и запускаем скрипт сборки djvu файла.
На выходе получаем такой результат (файл output.djvu):


Разница в качестве исходного и обработанного файла заметна невооруженным глазом.