unpaper очищает отсканированные страницы от тёмных полей, точечного мусора и серого фона, находит полезную область, исправляет небольшой наклон, выравнивает содержимое и при необходимости разделяет книжный разворот на две страницы. Пользователь управляет обработкой через параметры командной строки: выбирает шаблон листа, пороги фильтров, маски, границы, поворот, размер и схему имён для пакетной последовательности.
Рабочий процесс строится вокруг входного изображения, виртуального листа и одной или двух логических страниц. Команда загружает кадр, выполняет заранее определённую цепочку фильтров, помещает найденное содержимое в маску, корректирует геометрию и записывает результат. Поэтому настройку удобнее начинать с одного типичного скана, проверять его визуально, а затем переносить ту же команду на серию файлов с числовым шаблоном имени.
Автоматическое распознавание полей и угла рассчитано прежде всего на печатный текст с заметным контрастом относительно бумаги. Иллюстрации до края, рукописные пометки, печати, таблицы с тонкими линиями и неравномерно освещённые фотографии требуют осторожных порогов или отключения отдельных этапов. Для безопасной настройки предусмотрены тестовый запуск, подробный журнал параметров и независимые выключатели каждого фильтра.
Скачать unpaper
- Редактирование PDF
- Русский интерфейс
- Просто новичкам
- Нет графического интерфейса
- Вывод только в PNM
- Автонастройка ошибается
Как unpaper представляет скан
В терминологии программы sheet — это рабочий лист в памяти, а page — прямоугольная область с содержимым документа. Такое разделение необходимо, потому что один скан может содержать одиночную страницу, две соседние страницы книги или, наоборот, быть одной половиной будущего разворота. Параметры количества входных и выходных файлов не равны параметру макета: они отвечают за чтение и запись файлов, тогда как макет задаёт расположение полезных областей внутри листа.
При обычной обработке один входной файл помещается на один лист и даёт один выходной файл. Режим --input-pages 2 читает две последовательные картинки и располагает их на одном листе. Режим --output-pages 2 делит готовый лист пополам и записывает две картинки. Эти механизмы можно сочетать с --layout single, --layout double или --layout none, но сочетание должно соответствовать реальной геометрии скана, иначе маски будут искать текст не в тех областях.


Шаблоны single, double и none
--layout single предполагает одну страницу на всём листе и подходит для листовых документов, журналов, писем и уже разделённых книжных страниц. --layout double создаёт две области — левую и правую — и рассчитан на разворот. --layout none не подставляет готовую схему; его используют, когда маски и точки сканирования задаются вручную или когда требуется только ограниченный набор фильтров без автоматической интерпретации страницы.
Положение --layout в командной строке имеет практическое значение: шаблон разворачивается в набор других настроек, поэтому индивидуальные параметры, которыми нужно его переопределить, ставят после выбора макета. Например, сначала указывают --layout double, затем меняют направления поиска масок или пределы выравнивания. Если записать пользовательскую настройку раньше шаблона, более поздний шаблон способен вернуть своё значение.

Форматы файлов и подготовка изображений
Наиболее предсказуемый обмен с unpaper обеспечивает семейство Netpbm: PBM для двухцветного растра, PGM для восьмибитного серого и PPM для полноцветного изображения. Тип результата выбирается параметром --type pbm, --type pgm или --type ppm. Расширение имени лучше согласовывать с типом, чтобы следующий инструмент не определял формат по неверному суффиксу. PNM может быть общим названием семейства, но для автоматизации удобнее явный PBM, PGM или PPM.
Ввод и вывод реализованы с участием библиотек FFmpeg, однако возможность прочитать конкретный TIFF, JPEG или PNG зависит от сборки и пиксельного формата. Поэтому надёжная производственная цепочка сначала преобразует исходник в PGM или PPM, запускает очистку, а затем кодирует результат в PNG, TIFF либо PDF. Такой промежуточный этап делает глубину цвета и размеры прозрачными, упрощает поиск ошибок и исключает ситуации, когда декодер принимает контейнер, но отклоняет необычную разрядность или цветовую модель.
ffmpeg -i scan-001.tif -pix_fmt gray input-001.pgm
unpaper input-001.pgm output-001.pgm
ffmpeg -i output-001.pgm cleaned-001.png
Когда выбирать PBM, PGM и PPM
PBM экономичен для уже бинаризованного текста, но в нём нет полутонов, поэтому ранний переход к одному биту может разрушить тонкие засечки, карандашные пометки и серые линии таблиц. PGM обычно является лучшим рабочим форматом для чёрно-белых книг: он сохраняет градации бумаги и даёт фильтрам достаточно информации для отделения фона от текста. PPM нужен для цветных штампов, иллюстраций и документов, где цвет несёт смысл; при этом он значительно увеличивает объём временных файлов и потребление памяти.
Порог --white-threshold определяет, насколько светлый пиксель считается белым, а --black-threshold — насколько тёмный считается чёрным. Значения задаются долями от нуля до единицы. Слишком низкий белый порог оставляет серую бумагу как содержимое и мешает поиску границ; слишком высокий способен осветлить слабую печать. Чёрный порог влияет на распознавание тёмных областей: его повышение расширяет класс чёрного, а понижение заставляет алгоритм считать чёрными только наиболее тёмные пиксели.
Размеры, разрешение и единицы
Параметр --dpi задаёт разрешение, используемое при разборе величин, записанных в физических единицах. Его ставят до таких величин, потому что преобразование в пиксели выполняется при чтении аргументов. Для серии сканов с разным фактическим разрешением лучше сначала привести изображения к одной сетке, иначе одинаковый отступ в миллиметрах превратится в разное число пикселей и нарушит единообразие полей.
Геометрию можно задавать пикселями или поддерживаемыми размерными выражениями. Но для отладки предпочтительны пиксели: их легко сверить по свойствам изображения, и они не зависят от неверной метки DPI в файле. Физические единицы удобны на стабилизированном процессе, где сканер всегда выдаёт, например, 300 точек на дюйм и размеры листа не меняются.
Первый безопасный запуск
Начальную команду лучше делать минимальной: один вход, один выход и подробный журнал. Флаг -vv печатает значения параметров до обработки, поэтому журнал можно сохранить рядом с тестовым изображением. Флаг --test-only анализирует вход и сообщает сведения, не записывая результат; он полезен для проверки шаблонов имён, диапазона листов и синтаксиса до долгого пакетного запуска.
unpaper -vv --test-only input.pgm output.pgm
unpaper -vv --overwrite input.pgm output.pgm
--overwrite разрешает заменить существующий результат. Без него защита от перезаписи помогает не уничтожить удачный набор, но пакет может остановиться на файле, оставшемся от прошлой попытки. Практичная схема — писать каждый эксперимент в отдельный каталог, не включать перезапись во время подбора настроек и добавлять её только в воспроизводимый сценарий, где выходная папка очищается заранее.
--quiet убирает обычные сообщения, --verbose добавляет подробности, а -vv показывает ещё больше диагностических данных. В интерактивном тесте полезен самый подробный режим; в планировщике задач обычно оставляют обычный вывод и перенаправляют его в журнал. Полная тишина уместна только тогда, когда код возврата и наличие каждого результата проверяются отдельным скриптом.
Порядок обработки и почему он важен
Этапы выполняются не в произвольной последовательности. Сначала файл загружается и при необходимости предварительно поворачивается, отражается или сдвигается. Затем изображение помещается на рабочий лист, запускаются шумовые и фоновые фильтры, формируются маски, определяется наклон, маски уточняются, содержимое центрируется, вычисляются границы, выполняется выравнивание, после чего применяются завершающие геометрические операции и файл сохраняется. Изменить этот порядок перестановкой аргументов нельзя.
Из фиксированной последовательности следует важное правило диагностики: ошибка позднего этапа часто вызвана ранним. Если рамка определяется неверно, причиной может быть не сам border-scan, а чрезмерный grayfilter, который сделал слабый текст частью фона, или mask-scan, который выбрал слишком маленькую область. Настройку ведут слева направо по конвейеру: сначала вход и предварительная геометрия, затем очистка, маски, наклон, границы и окончательная посадка.

Удаление тёмных полей: blackfilter
Blackfilter предназначен для крупных тёмных участков вне страницы: теней по краям копии, полосы у корешка и чёрного фона вокруг листа. Алгоритм сканирует изображение полосами в заданных направлениях и оценивает долю тёмных пикселей. Если область проходит порог, она очищается как фон. Это не универсальная бинаризация: фильтр ищет именно крупные зоны и способен задеть фотографии, плотные таблицы или чёрные плашки, если они находятся в траектории сканирования.
--blackfilter-scan-direction задаёт направления поиска, --blackfilter-scan-size — размеры сканирующего окна, --blackfilter-scan-depth — насколько далеко заходить от края, --blackfilter-scan-step — шаг между измерениями, а --blackfilter-scan-threshold — требуемую долю тёмного. Более крупный шаг ускоряет поиск, но может перескочить узкую полосу; меньший шаг точнее и медленнее. Большая глубина полезна при широком чёрном поле, но опасна для контента близко к краю.
Параметр --blackfilter-scan-exclude исключает прямоугольник из анализа. Он особенно полезен для газетной полосы, где фото или тёмный заголовок расположены у внешнего края: фильтр продолжает убирать поля, но не принимает защищённую область за мусор. --blackfilter-intensity определяет интенсивность очистки найденной зоны. Подбор начинают с направления и глубины, затем корректируют порог и только после этого интенсивность.
Флаг --no-blackfilter полностью отключает этап. Это правильное решение для изображений с чёрной рамкой как частью дизайна, музыкальных нот с плотными элементами у края, негативов, фотографий и страниц с заливкой. Отключение одного этапа лучше, чем попытка компенсировать его ошибку более поздними границами: удалённые пиксели последующие операции уже не восстановят.

Точечный шум, размытие и серый фон
Noisefilter
Noisefilter удаляет небольшие изолированные кластеры тёмных пикселей. --noisefilter-intensity определяет максимальный размер или силу объекта, который считается шумом. Малое значение снимает отдельные точки от пыли, не вмешиваясь в буквы. Чрезмерное значение опасно для точек над i, знаков пунктуации, диакритики, тонких засечек, нотных символов и мелкого индекса. Проверять нужно не только крупный текст, но и самый мелкий кегль на странице.
Для факсов и копий с перцем настройку повышают постепенно и сравнивают участки с запятыми, точками, номерами сносок и штрихами таблицы. Если шум соединён с буквами, фильтр малых кластеров не обязан его удалить; тогда лучше улучшить исходное сканирование или применить специализированную морфологию до unpaper. Флаг --no-noisefilter сохраняет весь мелкий рисунок и нужен для чертежей, рукописей и документов, где каждая точка может быть значимой.
Blurfilter
Blurfilter обнаруживает размытые тёмные области по статистике окна, а не делает изображение более резким. Его параметры --blurfilter-size, --blurfilter-step и --blurfilter-intensity задают размер анализируемого окна, шаг и порог реакции. Фильтр полезен против широких мягких теней и просвечивания, но может принять полутоновую иллюстрацию за дефект. Для страниц с фотографиями его обычно отключают или ограничивают областью, где находятся только поля.
Большое окно сглаживает локальные вариации и реагирует на протяжённые пятна, маленькое — на мелкие фрагменты. Уменьшение шага делает карту анализа плотнее. При настройке важно оценивать не только белый фон, но и серые элементы документа: водяные знаки, цветные подложки, карандашные пометки. Если они нужны, --no-blurfilter безопаснее агрессивного порога.
Grayfilter
Grayfilter очищает области, где средний уровень близок к фону, и помогает убрать серую бумагу, слабое просвечивание обратной стороны и неоднородность копии. --grayfilter-size задаёт окно, --grayfilter-step — шаг, --grayfilter-threshold — границу решения. Чем выше требование к белизне, тем больше слабых деталей может исчезнуть. У газетной бумаги фон и тонкие буквы часто близки по яркости, поэтому стандартный порог проверяют на наиболее бледной колонке.
Grayfilter не заменяет выравнивание освещения для фотографий, снятых камерой. Если одна сторона листа существенно темнее другой, единый порог либо оставит тень, либо удалит светлый текст. В такой ситуации сначала корректируют освещённость градиентным инструментом, затем используют unpaper для геометрии и полей. Флаг --no-grayfilter полезен на иллюстрированных страницах и документах с серой сеткой.
Маски: как программа находит содержимое
Маска ограничивает прямоугольную область страницы, которую программа считает полезной. Автоматический поиск стартует из одной или нескольких точек --mask-scan-point и расширяет область по заданным направлениям, пока статистика пикселей указывает на содержимое. Для разворота нужны как минимум две логические области или точки, расположенные в левой и правой половине. Неверная стартовая точка может попасть в пустое поле, корешок или иллюстрацию и сформировать маску не того размера.
--mask-scan-direction определяет горизонтальный или вертикальный поиск, --mask-scan-size — окно, --mask-scan-depth — максимальную глубину, --mask-scan-step — дискретность, а --mask-scan-threshold — чувствительность. --mask-scan-minimum не позволяет принять слишком маленький объект за страницу. Пределы --mask-scan-maximum и параметры максимального размера страницы защищают от маски, разросшейся до тёмной рамки или соседнего листа.

Ручные маски
Опция --mask задаёт прямоугольник фиксированными координатами. Её можно повторять, формируя сложный макет с несколькими областями. Ручной режим надёжен для сканера с постоянной подачей, когда лист всегда лежит в одном месте, и для форм, где полезные зоны известны заранее. Он хуже переносит случайный сдвиг, поэтому сначала стабилизируют размер холста и ориентацию, а координаты берут с типичного кадра с запасом.
--pre-mask применяется раньше основных масок и позволяет скрыть участок, который мешает распознаванию: штамп калибровки, край держателя, номер кадра или неизменную чёрную панель. --mask-color задаёт цвет заполнения вне маски. Для текстовых страниц обычно выбирают белый, но в цветном процессе значение должно соответствовать ожидаемому фону, иначе вокруг полезной области появится заметная рамка.
--no-mask-scan отключает автоматическое построение масок, а --no-mask-center запрещает последующее центрирование найденной области. Первое используют при ручных координатах, второе — когда нужно сохранить исходное положение текста на листе. Например, архивная копия может требовать одинаковой физической привязки печати, а не эстетического центрирования каждой страницы.

Исправление наклона
Deskew измеряет небольшой поворот печатного блока и разворачивает страницу на противоположный угол. Поиск выполняется вдоль виртуальных полос у краёв маски: алгоритм сравнивает, насколько хорошо вертикальные или горизонтальные границы текста согласуются при разных углах. Поэтому результат лучше на страницах с прямыми строками и стабильными полями и хуже на рукописи, диагональной графике, круглых печатях или фотографии без выраженных текстовых краёв.
--deskew-scan-direction выбирает стороны анализа; по умолчанию полезны левая и правая границы. --deskew-scan-size задаёт длину полосы, --deskew-scan-depth — глубину поиска, --deskew-scan-range — допустимый диапазон углов, --deskew-scan-step — шаг перебора, а --deskew-scan-deviation — требуемую уверенность или допустимое отклонение. Малый шаг повышает точность, но увеличивает время.


Диапазон не стоит расширять без необходимости. Deskew рассчитан на небольшой перекос, а поворот на 90 градусов выполняется отдельной предварительной или завершающей операцией. Если страница лежит боком, сначала применяют --pre-rotate 90 или --pre-rotate -90, а затем оставляют deskew для остаточного угла. Попытка заставить поиск малого наклона исправить четверть оборота даёт нестабильную маску и огромные пустые поля.
При ложном повороте сначала проверяют, какая сторона сканируется, затем уменьшают диапазон и убеждаются, что маска охватывает именно текст. Для двухстраничного разворота каждая страница должна иметь собственную область; общий анализ по наклонённому корешку может дать угол, не соответствующий ни одной половине. --no-deskew сохраняет исходную ориентацию и нужен для схем с намеренными диагоналями или когда угол уже исправлен другим инструментом.

Границы, поля и выравнивание
После определения содержимого unpaper может найти внешние границы и привести поля к заданной схеме. --border-scan-direction выбирает стороны поиска, --border-scan-size — окно, --border-scan-step — шаг, --border-scan-threshold — чувствительность. На чистом белом поле граница находится легко; на серой бумаге, тенях и полноформатной иллюстрации статистика неоднозначна, поэтому сначала настраивают фоновые фильтры или задают границы вручную.
--border задаёт явные величины границ, а --pre-border и --post-border применяют их до или после основной обработки. --border-align выбирает выравнивание содержимого относительно стороны, --border-margin добавляет фиксированный отступ. Эта пара удобна для книжного блока: можно выровнять текст по внутреннему краю и оставить одинаковый внешний запас, не растягивая сами буквы.

--no-border-scan отключает автоматический поиск, --no-border-align — перемещение по найденным границам, а --no-border — операции с границами целиком. Диагностика строится по отдельности: если рамка определяется верно, но текст смещается, отключают align; если рамка ошибочна, оставляют ручной border или выключают scan. Это позволяет не терять полезный этап только потому, что соседний параметр не подходит конкретному оригиналу.
Wipe и middle-wipe
--wipe закрашивает указанный прямоугольник цветом фона. Это точный инструмент для неизменного мусора: метки сканера, пробитого отверстия, номерной полосы или повреждённого края. --middle-wipe очищает центральную полосу и особенно полезен на книжном развороте с тёмным корешком. Координаты проверяют на листах с максимальным смещением, иначе фиксированная зона может задеть текст.
Флаг --no-wipe отключает автоматические стирания, заданные шаблоном или командой. Wipe не должен использоваться как замена распознаванию содержимого на неоднородной серии: если дефект плавает, фиксированный прямоугольник либо не очистит его, либо начнёт удалять разные участки текста. В таком случае корректируют позиционирование входа или применяют маски с устойчивыми точками поиска.
Поворот, отражение, сдвиг и масштаб
--pre-rotate и --post-rotate выполняют поворот на четверть оборота до или после основной цепочки. Предварительный поворот нужен, чтобы фильтры видели страницу в нормальной ориентации; завершающий — чтобы сохранить требуемую ориентацию файла после анализа. Значения обычно ограничиваются 90 и −90 градусами. Для малого угла используют deskew, а не rotate.
--pre-mirror и --post-mirror отражают изображение вертикально, горизонтально или по обеим осям. Это средство исправления зеркального сканирования и ориентации обратной стороны, а не художественный эффект. Отражение до обработки меняет стороны полей, направления border-scan и точки масок, поэтому связанные координаты задают уже в отражённой системе.
--pre-shift и --post-shift сдвигают изображение на заданное число пикселей. Предварительный сдвиг полезен, когда аппарат стабильно размещает лист с постоянным смещением, завершающий — для точной посадки готовой страницы на холст. Положительный и отрицательный знак проверяют на одном кадре, потому что направление осей легче подтвердить результатом, чем запоминать в длинном сценарии.
--size задаёт рабочий размер листа, --post-size — окончательный размер. --stretch и --post-stretch принудительно растягивают изображение к размеру, а --zoom и --post-zoom масштабируют пропорционально. Растяжение меняет соотношение сторон и может исказить шрифт; для архивных страниц чаще используют холст нужного размера, поля и пропорциональный zoom.
--interpolate nearest выбирает ближайшего соседа, linear — линейную, cubic — кубическую интерполяцию. Nearest сохраняет резкие ступени бинарного растра и подходит для PBM, но выглядит грубо на сером тексте. Cubic обычно даёт более гладкий результат при повороте и масштабе, хотя может добавить промежуточные оттенки. Выбор проверяют на тонких горизонтальных и вертикальных штрихах.
Развороты книг и разделение на две страницы
Для готового изображения разворота типичная команда использует --layout double и --output-pages 2. Макет создаёт две маски, а выходной режим записывает левую и правую половины по отдельным шаблонам. Имена обязаны содержать числовую подстановку, иначе кодек вывода или сама программа не сможет безопасно породить два файла из одного аргумента.
unpaper --layout double --output-pages 2 spread%03d.pgm page%03d.pgm
Центральный корешок очищают --middle-wipe только после измерения его максимальной ширины. Если строки заходят близко к сгибу, лучше уменьшить полосу и оставить часть тени, чем потерять буквы. Для разворотов с разным изгибом unpaper исправляет общий наклон и поля, но не выполняет сложное геометрическое распрямление кривой строки; для такого дефекта нужен инструмент dewarp.
Когда левая и правая страницы имеют разную яркость, общий grayfilter может быть слишком строгим для одной половины. Тогда разворот сначала делят без агрессивной очистки, а каждую последовательность обрабатывают своей командой. Это увеличивает число шагов, зато позволяет раздельно подобрать белый порог, глубину blackfilter и направления deskew для чётной и нечётной стороны.

Объединение одиночных страниц в лист
--input-pages 2 читает два последовательных изображения для одного рабочего листа. Такой режим полезен не только для создания разворотов: с ним можно нормализовать парные сканы, сравнивать левую и правую геометрию или подготовить печатный лист. Если дальнейшая цель — PDF по одной странице на лист, объединять изображения обычно не нужно; режим выбирают только когда парное расположение является частью результата.
При чтении двух файлов входной счётчик увеличивается быстрее выходного. Шаблон single%03d.pgm последовательно даёт 001 и 002 для первого листа, 003 и 004 для второго, тогда как sheet%03d.pgm увеличивается один раз на лист. Ошибка в ожидании счётчиков приводит к пропускам, поэтому маленькую тестовую серию из четырёх файлов запускают до обработки всей книги.

Пакетная обработка и шаблоны имён
Числовой шаблон записывается в стиле printf, например %03d для 001, 002, 003. Число между знаком процента и буквой d задаёт ширину и ведущие нули. Входной и выходной счётчики независимы, что важно при схемах два-к-одному и один-к-двум. Имена без шаблона подходят только для единичного запуска или режима, где мультистраничная обработка явно отключена.
--start-input и --start-output задают начальные индексы. Они позволяют продолжить серию с нужного номера и не переименовывать готовые страницы. --start-sheet и --end-sheet ограничивают диапазон рабочих листов, --sheet выбирает конкретные, а --exclude пропускает указанные номера. Перед продолжением сверяют, относится номер к входному файлу, выходному файлу или листу: это три разных счётчика.
--insert-blank вставляет пустой лист в последовательность, а --replace-blank заменяет выбранный вход пустым. Эти параметры полезны для сохранения пагинации, когда скан отсутствует или должен быть исключён, но номера последующих страниц менять нельзя. Цвет и размер пустой страницы должны соответствовать текущему листу; иначе при сборке PDF появится кадр другого формата.
--no-multi-pages запрещает автоматическое продолжение по шаблону и заставляет обработать только явно заданную пару. Это безопасный режим для отладки: случайная маска имени не запустит сотни файлов. После проверки его убирают и задают чёткий диапазон либо контролируют наличие входов. Сценарий должен считать отсутствие ожидаемого файла ошибкой, а не молча завершать неполную книгу.

Практический сценарий: очистка книжной страницы
- Преобразуйте один типичный скан в PGM без изменения размера и сохраните исходник отдельно.
- Запустите
unpaper -vvс макетом single и запишите результат в новый каталог. - Сравните внешние поля, корешковую тень, мелкий текст, номера страниц и иллюстрации при масштабе 100–200 процентов.
- Если исчезает полезная деталь, по очереди отключите blackfilter, noisefilter, blurfilter и grayfilter, чтобы найти виновный этап.
- Настройте маску и deskew только после того, как ранние фильтры перестали повреждать изображение.
- Зафиксируйте команду в сценарии, обработайте десять разнородных страниц и лишь затем запускайте всю книгу.
Контрольная выборка должна включать первую и последнюю страницу, самый светлый и самый тёмный скан, лист с иллюстрацией, страницу с минимальными полями и разворот с сильной тенью. Одна идеальная страница не показывает устойчивость параметров. Настройка считается пригодной, когда она не только красиво очищает средний кадр, но и не повреждает крайние случаи.
Практический сценарий: подготовка к OCR
Перед распознаванием unpaper применяют для исправления наклона, удаления крупных полей и снижения фонового шума. Главная цель — не максимальная визуальная белизна, а сохранение формы символов. OCR обычно выигрывает от ровных строк и чистого фона, но проигрывает от удалённых точек, слитых штрихов и искусственно размытого текста. Поэтому noisefilter держат умеренным, а PBM создают только после проверки качества на сером оригинале.
OCRmyPDF может вызывать unpaper через режимы очистки, причём вариант clean-final помещает очищенный растр в итоговый документ. В таком процессе параметры unpaper передаются отдельной строкой аргументов, а страницы после обработки обязательно просматривают: автоматическая очистка способна удалить значимую графику. Когда требуется только подготовить изображение для распознавания, но сохранить исходный вид PDF, выбирают режим, где очищенная копия используется для OCR, а не подменяет отображаемую страницу.
Для прямой цепочки PGM → unpaper → Tesseract разрешение должно быть известно и одинаково интерпретироваться обоими инструментами. Если изображение физически соответствует A4 при 300 dpi, но метка разрешения потеряна, OCR может неверно оценить размер букв. Записывайте DPI при конвертации или передавайте его распознавателю явно, не полагаясь на расширение файла.
Практический сценарий: копии с чёрными краями
У копий, сделанных с неполным прилеганием крышки, край листа часто окружён почти сплошным чёрным полем. Сначала задают направление blackfilter от проблемной стороны и глубину, которая немного превышает максимальную ширину полосы. Порог подбирают так, чтобы тёмная рамка проходила проверку, а плотный текст — нет. Затем маска ограничивает содержимое и border-align восстанавливает одинаковый отступ.
Если чёрная область касается иллюстрации, применяют exclude-прямоугольник или обрабатывают такие листы отдельным профилем. Не следует увеличивать интенсивность для всей книги из-за нескольких тяжёлых кадров. Разделение серии на два-три профиля обычно быстрее ручного восстановления удалённых фрагментов и даёт лучшее единообразие.
Практический сценарий: смешанная серия
В одной папке могут оказаться одиночные страницы, развороты, цветные вклейки и пустые обороты. Один универсальный вызов здесь ненадёжен. Сначала создают список файлов по типам: single для одиночных, double для разворотов, щадящий профиль без grayfilter для иллюстраций и blank-операции для отсутствующих кадров. Нумерацию выхода планируют заранее, чтобы после раздельной обработки файлы можно было собрать в правильном порядке.
Сценарий-обёртка должен проверять код завершения, размер результата и существование ожидаемого количества файлов. Нулевой байтовый размер, отсутствие второй страницы при --output-pages 2 или неожиданное изменение геометрии считается ошибкой. Автоматическая проверка не заменяет визуальную, но быстро обнаруживает сбой декодера, неверный шаблон имени и переполненный диск.
Диагностика типичных ошибок
Файл не открывается или сообщается unsupported pixel format
Сначала преобразуйте вход в простой PGM или PPM через FFmpeg и повторите команду. Если такой файл читается, проблема находится в контейнере, разрядности или цветовой модели исходника, а не в геометрических параметрах. Проверяйте, что PGM действительно является изображением Netpbm, а не переименованным PNG. Для стабильного пакетного процесса фиксируйте одну команду конвертации и не смешивайте результаты разных сканеров без нормализации.
Выходной кодек требует шаблон последовательности
Сообщение о необходимости %03d возникает, когда FFmpeg воспринимает имя как последовательность либо команда потенциально создаёт несколько кадров. Для одиночного результата используйте простой PNM-выход и убедитесь, что включён один выходной файл; для двух страниц или пакета добавьте числовой шаблон. Точки и цифры в обычном имени не заменяют спецификатор процента.
Программа отказывается перезаписывать результат
Удалите старый файл, выберите другой каталог или осознанно добавьте --overwrite. Не включайте перезапись как автоматическую реакцию, пока не проверено, что путь вывода не совпадает с входом и не указывает на единственную копию данных. Хорошая структура каталогов разделяет raw, normalized, cleaned и final, поэтому каждый этап можно повторить без потери исходников.
После очистки пропали номера страниц или примечания
Отключайте фильтры в порядке их выполнения. Если деталь исчезает уже без grayfilter, проверьте noisefilter и blackfilter; если сохраняется до масок, увеличьте минимальный размер маски или добавьте ручную область. Номера страниц часто лежат далеко от основного текста, поэтому автоматическая маска может считать их мусором даже при корректно очищенном фоне. Решение — расширить маску, использовать border-margin или обрабатывать номера отдельным профилем.
Страница повернулась в неверную сторону
Уменьшите --deskew-scan-range, проверьте направления анализа и сначала исправьте ориентацию на 90 градусов через pre-rotate. Убедитесь, что маска не охватывает корешок или диагональную иллюстрацию. Если серия уже выровнена сканером, отключите deskew: повторная оценка небольшого угла на почти идеальном кадре иногда реагирует на случайные края.
Граница прыгает от страницы к странице
Проверьте однородность размера и фона входов. Слишком большой шаг border-scan пропускает тонкий переход, слишком чувствительный порог реагирует на серую бумагу. На стабильном сканере ручной border часто надёжнее автоматического. Если размер страницы меняется, сначала задайте общий холст через size и только потом выравнивайте содержимое.
Результат пустой или почти белый
Наиболее вероятны агрессивные пороги или маска, попавшая в пустую область. Запустите с --no-processing, чтобы проверить чтение и запись без фильтров, затем включайте этапы по одному. Сверьте white-threshold, black-threshold и координаты маски с реальными размерами. Если вход бинарный, не используйте настройки, рассчитанные на плавный серый фон.
Обработка занимает слишком много памяти
PPM хранит три цветовых канала и на больших сканах требует существенно больше памяти, чем PGM. Переведите текстовые страницы в серый формат, обрабатывайте файлы последовательно, не запускайте слишком много параллельных процессов и не увеличивайте лист без необходимости. Временные несжатые PNM-файлы также требуют места на диске; проверяйте свободный объём до серии в тысячи страниц.
Установка и проверка окружения
В Linux программа доступна в репозиториях распространённых дистрибутивов; в macOS её можно установить через Homebrew, а в среде MSYS2 — пакетным менеджером соответствующего окружения. Независимо от способа поставки проверьте, что команда unpaper --version запускается из того же терминала, где будет работать сценарий, и что зависимости FFmpeg найдены загрузчиком библиотек.
При сборке из исходного кода используется Meson: создаётся каталог сборки, затем выполняется компиляция и установка. Ошибка на этапе конфигурации обычно означает отсутствие заголовков FFmpeg, pkg-config или компилятора C. После установки запустите простой проход PGM → PGM и только затем интегрируйте программу в OCRmyPDF, gscan2pdf или собственный конвейер.
meson setup builddir
meson compile -C builddir
meson install -C builddir
На Windows отдельный пакет MSYS2 работает внутри выбранной среды и использует её библиотеки FFmpeg. Исторические самостоятельные сборки могут запускаться без полного Unix-окружения, но их совместимость и набор исправлений следует проверять на копии данных. Для автоматизации важнее повторяемый комплект зависимостей, чем перенос одного исполняемого файла между компьютерами.
Интеграция с другими программами
gscan2pdf предоставляет графическую организацию сканирования, страниц и экспорта и может вызывать unpaper как внешний этап очистки. Такой вариант удобен, когда пользователю нужен визуальный список страниц, поворот и сборка PDF, но качество фильтров unpaper остаётся зависимым от установленных внешних компонентов. Диагностику всё равно полезно выполнять отдельной командой на проблемном промежуточном файле.
OCRmyPDF ориентирован на существующие PDF и добавление поискового текстового слоя. Его --clean и --clean-final используют unpaper при наличии программы. Первый вариант может применять очищенную копию для улучшения распознавания, второй помещает очистку в итоговое изображение. Для документов с графикой безопаснее начинать без clean-final и сравнивать страницы, потому что удалённая деталь попадёт в финальный PDF.
ImageMagick и FFmpeg дополняют unpaper преобразованием форматов, изменением глубины цвета, сборкой изображений и созданием PDF. Они умеют отдельные операции deskew, trim и threshold, но не повторяют всю модель листов, масок и парных страниц. В воспроизводимом сценарии каждый инструмент выполняет ограниченную роль: конвертация, очистка, OCR и упаковка документа не смешиваются в одну непрозрачную команду.
Сравнение unpaper с аналогами
| Программа | Лучше подходит для | Главное ограничение |
|---|---|---|
| unpaper | Пакетной очистки, масок, deskew и разделения растровых сканов | Нет интерактивного просмотра и нативного PDF-вывода |
| ScanTailor Advanced | Ручной постобработки книг с визуальными этапами, зонами и полями | Требует больше действий на проект и не выполняет OCR |
| OCRmyPDF | Создания поискового PDF с OCR, deskew и автоматическим конвейером | Тонкая правка масок страницы не является его основной задачей |
| gscan2pdf | Сканирования, сортировки страниц, OCR и сборки PDF или DjVu в графическом окне | Часть очистки зависит от внешних утилит |
| ImageMagick | Конвертации форматов и универсальных операций над отдельными изображениями | Нет готовой модели книжного листа и двух страниц |
| PDF Commander | Финальной сборки, перестановки, редактирования и оформления PDF | Не заменяет специализированную очистку исходного растра |
Для полностью автоматической серии однотипных сканов выбирайте unpaper и сохраняйте проверенный набор параметров. Для книги, где каждую страницу нужно визуально поправлять, удобнее ScanTailor Advanced. Когда главная цель — поисковый PDF, берите OCRmyPDF и подключайте очистку только после теста. gscan2pdf подходит оператору сканера, ImageMagick — для конвертации и нестандартных пиксельных операций, а PDF Commander — для работы с уже собранным PDF после завершения растровой подготовки.
Подробный справочник параметров
Ниже параметры сгруппированы по практическому назначению. Значение по умолчанию полезно как отправная точка, но не гарантирует сохранность конкретного оригинала. При изменении одного параметра фиксируйте команду и контрольное изображение, иначе невозможно понять, какая настройка дала результат.
| Группа | Параметр | Практическое действие |
|---|---|---|
| Файлы и диапазоны | --start-sheet N | Начинает обработку с рабочего листа N; не путать с номером входного файла. |
| Файлы и диапазоны | --end-sheet N | Останавливается после листа N и ограничивает длинную последовательность. |
| Файлы и диапазоны | --sheet N | Обрабатывает выбранный лист; параметр можно использовать для точечного повторного прохода. |
| Файлы и диапазоны | --exclude N | Пропускает лист, сохраняя логику счётчиков серии. |
| Файлы и диапазоны | --start-input N | Задаёт начальное число, подставляемое во входной шаблон. |
| Файлы и диапазоны | --start-output N | Задаёт первое число в выходном шаблоне независимо от входа. |
| Файлы и диапазоны | --input-pages 1|2 | Определяет, сколько входных изображений собирается на один рабочий лист. |
| Файлы и диапазоны | --output-pages 1|2 | Определяет, сколько файлов записывается с одного рабочего листа. |
| Файлы и диапазоны | --no-multi-pages | Отключает продолжение по числовому шаблону и оставляет один проход. |
| Файлы и диапазоны | --insert-blank N | Вставляет пустую позицию для сохранения пагинации. |
| Файлы и диапазоны | --replace-blank N | Подменяет выбранную позицию пустым листом без сдвига последующих номеров. |
| Макет | --layout single | Использует одну логическую страницу на листе. |
| Макет | --layout double | Создаёт левую и правую логические страницы для разворота. |
| Макет | --layout none | Не применяет встроенный шаблон и оставляет геометрию пользовательским маскам. |
| Геометрия до фильтров | --pre-rotate 90|-90 | Исправляет четверть оборота до поиска полей и наклона. |
| Геометрия до фильтров | --pre-mirror v|h|v,h | Отражает вход до вычисления координат масок. |
| Геометрия до фильтров | --pre-shift X,Y | Компенсирует постоянное смещение сканера до анализа. |
| Геометрия до фильтров | --pre-wipe L,T,R,B | Стирает фиксированный прямоугольник перед автоматическими фильтрами. |
| Геометрия до фильтров | --pre-border L,T,R,B | Добавляет или задаёт предварительные поля до размещения на листе. |
| Геометрия | --size W,H | Фиксирует размер рабочего холста, на котором размещается вход. |
| Геометрия | --stretch W,H | Непропорционально растягивает изображение до заданных размеров. |
| Геометрия | --zoom F | Пропорционально масштабирует изображение коэффициентом F. |
| Blackfilter | --blackfilter-scan-direction | Ограничивает поиск крупных тёмных полей выбранными сторонами. |
| Blackfilter | --blackfilter-scan-size W,H | Задаёт размер окна, которым оценивается тёмная область. |
| Blackfilter | --blackfilter-scan-depth X,Y | Ограничивает глубину поиска от края листа. |
| Blackfilter | --blackfilter-scan-step X,Y | Устанавливает шаг перемещения окна; меньший шаг повышает детализацию. |
| Blackfilter | --blackfilter-scan-threshold F | Задаёт долю тёмных пикселей, необходимую для срабатывания. |
| Blackfilter | --blackfilter-scan-exclude | Защищает прямоугольную область от классификации как чёрное поле. |
| Blackfilter | --blackfilter-intensity N | Регулирует силу очистки найденных тёмных зон. |
| Blackfilter | --no-blackfilter | Сохраняет крупные тёмные области без участия этого фильтра. |
| Шум | --noisefilter-intensity N | Определяет, какие малые кластеры пикселей считать точечным мусором. |
| Шум | --no-noisefilter | Оставляет точки, диакритику и мелкие элементы без удаления кластеров. |
| Размытые пятна | --blurfilter-size W,H | Устанавливает окно статистики для мягких тёмных областей. |
| Размытые пятна | --blurfilter-step X,Y | Задаёт расстояние между соседними измерениями blurfilter. |
| Размытые пятна | --blurfilter-intensity F | Определяет чувствительность к размытым пятнам и теням. |
| Размытые пятна | --no-blurfilter | Не удаляет мягкие полутоновые области. |
| Серый фон | --grayfilter-size W,H | Задаёт окно оценки однородного серого фона. |
| Серый фон | --grayfilter-step X,Y | Регулирует плотность измерений по листу. |
| Серый фон | --grayfilter-threshold F | Устанавливает границу между фоном и сохраняемым содержимым. |
| Серый фон | --no-grayfilter | Сохраняет серую сетку, подложки и слабые полутона. |
| Маски | --mask-scan-point X,Y | Задаёт стартовую точку автоматического расширения маски. |
| Маски | --mask L,T,R,B | Определяет ручной прямоугольник полезного содержимого. |
| Маски | --pre-mask L,T,R,B | Ограничивает изображение до основного поиска масок. |
| Маски | --mask-scan-direction | Выбирает оси, по которым границы маски ищутся от стартовой точки. |
| Маски | --mask-scan-size W,H | Задаёт размер окна при поиске перехода фон–содержимое. |
| Маски | --mask-scan-depth X,Y | Ограничивает максимальное расширение маски. |
| Маски | --mask-scan-step X,Y | Определяет точность позиционирования границы маски. |
| Маски | --mask-scan-threshold F | Настраивает чувствительность к содержимому внутри окна. |
| Маски | --mask-scan-minimum W,H | Отбрасывает маски, слишком маленькие для страницы. |
| Маски | --mask-color R,G,B | Задаёт цвет, которым заполняется область вне полезной маски. |
| Маски | --no-mask-scan | Отключает автоматический поиск и оставляет ручные координаты. |
| Маски | --no-mask-center | Не перемещает найденное содержимое к центру страницы. |
| Deskew | --deskew-scan-direction | Выбирает стороны маски, по которым измеряется наклон. |
| Deskew | --deskew-scan-size N | Задаёт длину виртуальной полосы для анализа края текста. |
| Deskew | --deskew-scan-depth F | Определяет глубину просмотра внутрь маски. |
| Deskew | --deskew-scan-range F | Ограничивает максимальный небольшой угол поиска. |
| Deskew | --deskew-scan-step F | Задаёт угловой шаг перебора; уменьшение повышает точность и время. |
| Deskew | --deskew-scan-deviation F | Отсекает недостаточно убедительные оценки угла. |
| Deskew | --no-deskew | Не поворачивает содержимое по автоматически измеренному углу. |
| Стирание | --wipe L,T,R,B | Закрашивает заданный дефект после ранних фильтров. |
| Стирание | --middle-wipe L,T,R,B | Очищает центральную полосу книжного корешка. |
| Стирание | --no-wipe | Отключает все настроенные wipe-области. |
| Границы | --border L,T,R,B | Задаёт явные границы вместо автоматического измерения. |
| Границы | --border-scan-direction | Выбирает стороны для поиска края страницы. |
| Границы | --border-scan-size W,H | Определяет окно проверки перехода к фону. |
| Границы | --border-scan-step X,Y | Устанавливает дискретность поиска границы. |
| Границы | --border-scan-threshold F | Настраивает чувствительность к переходу между листом и полем. |
| Границы | --border-align | Прижимает полезную область к выбранным сторонам. |
| Границы | --border-margin | Добавляет контролируемый отступ после выравнивания. |
| Границы | --no-border-scan | Не вычисляет границы автоматически. |
| Границы | --no-border-align | Сохраняет положение содержимого, даже если границы найдены. |
| Границы | --no-border | Отключает весь этап работы с границами. |
| Пороги | --white-threshold F | Определяет уровень, начиная с которого пиксель считается белым. |
| Пороги | --black-threshold F | Определяет уровень, ниже которого пиксель считается чёрным. |
| Выход | --type pbm|pgm|ppm | Выбирает монохромный, серый или цветной формат Netpbm. |
| Выход | --interpolate nearest|linear|cubic | Выбирает метод пересчёта пикселей при повороте и масштабе. |
| Выход | --sheet-size W,H | Фиксирует размер листа для размещения страниц. |
| Выход | --sheet-background R,G,B | Задаёт цвет пустой части листа. |
| Выход | --post-size W,H | Приводит готовый лист к окончательному размеру. |
| Выход | --post-stretch W,H | Непропорционально растягивает уже обработанный результат. |
| Выход | --post-zoom F | Пропорционально масштабирует результат перед записью. |
| Выход | --post-rotate 90|-90 | Меняет окончательную ориентацию после всех измерений. |
| Выход | --post-mirror v|h|v,h | Отражает готовый лист перед сохранением. |
| Выход | --post-shift X,Y | Точно сдвигает готовое содержимое на выходном холсте. |
| Контроль | --no-processing | Проверяет чтение, размещение и запись без фильтров. |
| Контроль | --test-only | Выполняет проверочный анализ без создания результата. |
| Контроль | --overwrite | Разрешает замену существующего выходного файла. |
| Контроль | --quiet | Сокращает обычный вывод в журнал. |
| Контроль | --verbose | Добавляет диагностические сообщения. |
| Контроль | -vv | Печатает расширенный набор параметров и шагов обработки. |
| Контроль | --dpi N | Определяет перевод физических единиц в пиксели и ставится до размерных аргументов. |
Как подбирать параметры без потери данных
Используйте метод исключения. Сохраните базовую команду и меняйте за один проход только одну группу: фоновые фильтры, маски, deskew или границы. Имена выходов должны отражать эксперимент, например gray-045 или deskew-range-2. Сравнение двух результатов с несколькими одновременными изменениями не показывает причинно-следственную связь и ведёт к случайному подбору.
Оценивайте изображение при фактическом масштабе будущего использования и при увеличении. На экране по размеру страницы исчезновение точки может быть незаметно, но OCR или печать обнаружат дефект. Проверяйте чёрный текст, серый текст, линии, края иллюстраций, номер страницы и самый слабый фрагмент. Для цветного документа дополнительно сравнивайте оттенки печатей и тонкие цветные линии.
Храните исходный растр неизменным. Unpaper выполняет необратимые операции: стирает пиксели, поворачивает с интерполяцией и меняет размер. Результат одного агрессивного прохода не следует подавать на второй как новую основу, если можно повторить команду от raw. Цепочка из нескольких проходов допустима только когда каждый решает отдельную задачу и промежуточные файлы документированы.
Ограничения, которые нужно учитывать
У программы нет интерактивного окна с предварительным просмотром, рамками и ползунками. Координаты и пороги задаются аргументами, а оценка выполняется во внешнем просмотрщике. Это делает unpaper удобным для автоматизации, но увеличивает стоимость первоначальной настройки. Для разнородной небольшой коллекции визуальный редактор может оказаться быстрее, чем создание нескольких профилей командной строки.
Выход ориентирован на семейство PNM, поэтому PDF, TIFF или PNG обычно создаёт следующий инструмент. Это не недостаток качества растра: PGM и PPM удобны как несжатый промежуточный формат, но занимают много места и требуют явной сборки финального документа. Пользователь должен контролировать цветовую модель, разрешение и порядок страниц на этапе конвертации.
Автоматические фильтры основаны на геометрии и яркости, а не на понимании содержания. Они не знают, является ли маленькая точка грязью или частью буквы, чёрный прямоугольник — полем или иллюстрацией, а серая линия — просвечиванием или таблицей. Поэтому невозможно подобрать порог, гарантированно правильный для всех документов. Контрольная выборка и сохранение исходников являются частью корректного рабочего процесса.
Deskew исправляет небольшой общий наклон, но не распрямляет изогнутые строки у книжного корешка и не корректирует перспективу снимка, сделанного под углом. Для камеры нужны perspective correction и dewarp. Unpaper лучше работает после того, как четыре стороны листа уже приведены к прямоугольнику и освещение достаточно равномерно.
Программа не распознаёт текст и не создаёт поисковый слой. Она готовит растр для OCR, но выбор языка, сегментации, словаря и формат вывода остаётся задачей Tesseract, OCRmyPDF или другой системы. Чистый внешний вид не гарантирует лучшую точность: слишком сильная очистка способна ухудшить распознавание, поэтому метрику OCR проверяют на реальном тексте.
Контроль качества после пакетного запуска
- Сверьте число входных и выходных файлов с учётом режимов
input-pagesиoutput-pages. - Проверьте, что ни один результат не имеет нулевой длины и все изображения открываются декодером.
- Сравните размеры и тип PBM, PGM или PPM; неожиданный формат указывает на сбой команды.
- Просмотрите равномерно распределённую выборку, а также страницы с минимальным и максимальным размером файла.
- Проверьте внешние и внутренние поля, углы строк, номера страниц, сноски, иллюстрации и таблицы.
- Сохраните журнал команды, версию окружения и список исключений рядом с результатами.
Для длинной книги полезно автоматически создать контактный лист с миниатюрами всех страниц. На нём быстро видны скачки полей, неверный поворот, полностью белые кадры и случайно неразделённые развороты. После этого подозрительные страницы открывают в полном разрешении. Такой контроль сочетает скорость пакетного процесса с визуальной проверкой, которую рекомендует сама логика автоматической очистки.
Ответы на практические вопросы
Можно ли передать PDF напрямую?
Рабочий и контролируемый способ — сначала растрировать страницы PDF в отдельные изображения с выбранным DPI, обработать их и собрать новый PDF. Прямой путь зависит от поддержки контейнера конкретной сборкой и не даёт такого же контроля над страницами, цветом и нумерацией. Если исходный PDF содержит векторный текст, растрирование уничтожит его векторную природу; для такого документа unpaper применяют только к действительно сканированным страницам.
Как сохранить цветные печати?
Используйте PPM, отключите или ослабьте фильтры, основанные на сером фоне, и проверьте mask-color и sheet-background. Не переходите в PGM до очистки, если цвет имеет юридическое или смысловое значение. После обработки сравните каналы и убедитесь, что конвертер финального PDF не выполняет дополнительную бинаризацию.
Как не удалить точки и запятые?
Снижайте noisefilter-intensity или отключайте noisefilter. Проверяйте самый мелкий шрифт и диакритику. Если пыль и пунктуация имеют похожий размер, автоматический кластерный фильтр не сможет надёжно различить их; лучше оставить часть шума или применять локальную обработку только к полям.
Почему после deskew появились серые края букв?
Поворот требует интерполяции. Cubic и linear создают промежуточные оттенки, а nearest сохраняет ступенчатую бинарную структуру. Для серого текста лёгкие полутона нормальны и часто улучшают визуальное качество. Для строго бинарного архива сначала поворачивайте в PGM, а бинаризацию выполняйте после геометрии отдельным контролируемым шагом.
Можно ли сохранить исходное положение текста?
Отключите mask-center и border-align либо задайте только те операции, которые не перемещают содержимое. Фиксированный sheet-size позволит сохранить общий холст. Сравните координаты до и после на контрольных метках: поворот всё равно может изменить ограничивающий прямоугольник, поэтому полное геометрическое тождество несовместимо с deskew.
Как обрабатывать страницы разного размера?
Либо разделите их на профили, либо задайте достаточно большой общий холст и используйте маски с ограничениями. Автоматическое приведение всех листов к одному size может добавить поля или масштабировать содержимое; решение зависит от того, нужен ли единый формат PDF. Не растягивайте разные страницы до одной пропорции, если важно сохранить геометрию печати.
Как проверить команду без записи сотен файлов?
Используйте --test-only для синтаксиса и --no-multi-pages для одного прохода. Затем обработайте короткий диапазон через start-sheet и end-sheet в отдельный каталог. Только после проверки количества, имён и качества включайте полный диапазон и при необходимости overwrite.
Что делать с фотографиями внутри книги?
Выделите страницы с фотографиями в отдельный профиль. Отключите blurfilter и grayfilter, осторожно используйте blackfilter, сохраняйте цвет или серые полутона и ограничьте обработку геометрией, маской и полями. Если фотография доходит до края, автоматический border-scan может считать её частью рамки; в таком случае задайте ручные границы или оставьте исходный край.
Рекомендуемая структура воспроизводимого проекта
book/
raw/ # неизменные сканы
normalized/ # PGM или PPM одного размера
cleaned/ # результат unpaper
final/ # PNG/TIFF и собранный PDF
profiles/ # команды single, double, color
logs/ # вывод -vv и списки исключений
Имена профилей должны отражать назначение, а не случайный номер эксперимента: single-text, double-gutter, color-insert. В каждом профиле храните полную команду, ожидаемый тип входа, DPI, количество входных и выходных страниц и перечень исключений. Тогда обработку можно повторить на другом компьютере и понять, почему конкретный лист прошёл по особому пути.
Финальный PDF собирают только после контроля растров. Если сразу упаковать тысячи страниц, поиск ошибочного кадра усложняется, а повторная сборка маскирует происхождение дефекта. Хранение cleaned-изображений позволяет повторить OCR или изменить сжатие без повторного применения необратимых фильтров.
Когда unpaper подходит лучше всего
Наибольшую пользу программа даёт на больших сериях однотипных книжных и офисных сканов, где положение листа, характер фона и ширина полей меняются умеренно. Один тщательно проверенный профиль превращается в повторяемый пакетный этап: очищает рамки, выравнивает небольшой угол, нормализует поля и создаёт последовательность для OCR или сборки PDF.
Если каждая страница уникальна, содержит сложные иллюстрации, сильную перспективу или изогнутые строки, используйте unpaper только для тех операций, которые остаются предсказуемыми, либо выберите интерактивный инструмент. Критерий выбора прост: автоматизация оправдана, когда параметры можно проверить на репрезентативной выборке и они сохраняют все значимые детали без ручного восстановления.
Правильно настроенный процесс заканчивается не самой белой страницей, а контролируемым изображением с сохранённым текстом, ровной геометрией и понятной цепочкой преобразований. Исходник остаётся неизменным, команда и журнал сохраняются, исключения перечислены, а результаты просмотрены выборочно и по контактному листу. При таком подходе unpaper становится надёжным подготовительным этапом перед OCR и формированием PDF, а не рискованным фильтром, применённым вслепую.
Профили для разных типов оригиналов
Офисные листы с ровным белым фоном
Для договоров, писем и распечаток с широкими полями обычно достаточно single-макета, умеренного noisefilter и deskew с небольшим диапазоном. Blackfilter оставляют только тогда, когда сканер действительно создаёт тёмную рамку. Маска должна включать подписи, печати и рукописные добавления, которые часто выходят за основной печатный блок. Перед пакетным запуском отдельно проверяют страницу с самой светлой подписью и страницу с наиболее плотной печатью.
Если листы подаются автоподатчиком и их положение стабильно, ручная маска и фиксированный sheet-size дают более ровный результат, чем чувствительный автоматический поиск. Небольшой случайный сдвиг компенсируют запасом по краям, а окончательное положение задают border-align и margin. Не следует растягивать изображение для заполнения холста: это меняет геометрию букв и способно ухудшить последующее распознавание.
Старые книги на желтоватой бумаге
Жёлтый или серый фон лучше сначала представить в PGM, чтобы очистка работала с яркостью без лишнего объёма цветных каналов. Grayfilter подбирают по самой бледной странице, а не по средней. Если буквы просвечивают с оборота, большое окно может подавить мягкий рисунок, но слишком строгий порог затронет тонкую печать. Практически безопаснее оставить лёгкий фон, чем добиваться идеально белого листа ценой утраченных штрихов.
Корешковая тень на разворотах требует отдельного профиля double. Middle-wipe задают уже после того, как определена максимальная ширина сгиба, и проверяют строки, приближенные к центру. Если изгиб текста заметен, очистка тени не распрямит строки: сначала решают, допустима ли такая геометрия для чтения и OCR, либо передают изображения в инструмент с dewarp. Unpaper в этом профиле отвечает за поля, маски, небольшой общий наклон и разделение.
Газеты и многоколоночные страницы
Газетная полоса сочетает мелкий шрифт, тонкие разделители, фотографии и серую бумагу, поэтому noisefilter и grayfilter используют осторожно. Автоматическая маска должна охватывать крайние колонки и номера выпуска; минимальный размер маски увеличивают, чтобы отдельная плотная колонка не была принята за всю страницу. Blackfilter ограничивают внешними полями и исключают области с фотографиями у края.
Deskew оценивают по длинным вертикальным границам колонок или краям печатного блока. Если на странице преобладает диагональная реклама, направление анализа меняют либо этап отключают. После обработки сравнивают тонкие линейки между колонками и точки растра фотографии: их исчезновение показывает, что фильтр шума или серого фона настроен на обычный книжный текст, а не на газетный оригинал.
Рукописи и архивные пометки
Для рукописей главный риск — принять короткий штрих, точку или бледную карандашную линию за мусор. Noisefilter, blurfilter и grayfilter обычно отключают, оставляя предварительный поворот, мягкий deskew, ручную маску и контролируемые поля. Результат сохраняют в PGM или PPM без бинаризации. Если фон неоднороден, его лучше корректировать специализированным методом, который учитывает плавный градиент, а не удалять единым порогом.
Поля рукописи могут содержать поздние аннотации, номера фонда и карандашные указатели. Маска по центральному текстовому блоку их отрежет, поэтому границы задают по всему физическому листу или используют несколько ручных масок. Визуальная проверка должна включать пустые на первый взгляд поля: именно там чаще всего находятся слабые, но значимые знаки.
Чертежи, ноты и таблицы
Линии чертежа и нотные знаки по размеру похожи на кластерный шум, а плотные рамки таблиц похожи на тёмные поля. Для таких материалов отключают noisefilter и ограничивают blackfilter. Deskew может быть полезен, если лист содержит длинные прямые линии, но выбранная сторона анализа не должна совпадать с намеренной диагональю. Nearest-интерполяция сохраняет жёсткие бинарные линии, тогда как cubic лучше подходит серому антиалиасингу; выбор зависит от дальнейшей печати или OCR.
Border-scan на таблице до края листа может найти край содержимого вместо края бумаги. В стабильной серии используют ручной border и фиксированный холст. Если размеры чертежей различаются, их не приводят растяжением к одному формату: добавляют поля, сохраняя масштаб. После прохода измеряют контрольный отрезок, чтобы убедиться, что геометрические операции не изменили пропорции.
Производительность и организация больших серий
Основная нагрузка определяется числом пикселей, глубиной цвета, плотностью шагов сканирования и количеством параллельных процессов. Уменьшение mask-scan-step, border-scan-step и deskew-scan-step повышает точность, но увеличивает число проверок. Подбор выполняют на полном разрешении типичной страницы, потому что параметры, найденные на уменьшенной копии, не переносятся напрямую: размеры окон и кластеров выражены в пикселях.
Параллельный запуск ускоряет независимые страницы, но каждый процесс держит несжатый растр и рабочий лист. Для PPM большого формата память исчерпывается раньше процессорных ядер. Безопасный планировщик ограничивает число одновременных задач, записывает временные файлы на диск с достаточным запасом и прекращает серию при первой ошибке, а не продолжает с пропущенной страницей.
Кэширование промежуточных normalized-файлов экономит время, когда параметры unpaper меняются многократно. Конвертацию TIFF или PDF в PGM выполняют один раз, проверяют размеры и затем повторяют только очистку. После утверждения профиля временные эксперименты удаляют, но сохраняют один контрольный вход, ожидаемый выход и журнал -vv, чтобы будущая смена пакета или библиотек могла быть проверена сравнением.
Для нескольких тысяч страниц полезен манифест: номер, путь входа, профиль, ожидаемое количество выходов, фактический код завершения и контрольная сумма результата. Манифест показывает, какой командой создан каждый файл, и позволяет повторить только сбойные позиции. Он особенно важен при output-pages 2, где один вход порождает два результата и простое сравнение числа файлов не объясняет пропуск.
Проверка стабильности профиля
Устойчивость проверяют не одной серией из соседних страниц, а стратифицированной выборкой. Берут листы из начала, середины и конца, чётные и нечётные стороны, страницы с иллюстрациями, сносками, пустыми полями и максимальной тенью. Для каждого критического элемента заранее формулируют условие: номер страницы сохранён, корешок не касается текста, угол строки находится в допустимом диапазоне, размер холста одинаков.
После первого прохода параметры не корректируют по одному исключительному листу без оценки остальных. Если изменение помогает редкому дефекту, но ухудшает большинство, создают отдельный профиль и список исключений. Это не усложнение ради усложнения, а способ сохранить предсказуемость: каждый профиль описывает ограниченный класс входов, на котором его пороги действительно проверены.
Сравнение результатов желательно автоматизировать на уровне геометрии и файловых свойств. Скрипт может измерять размеры, долю почти белых пикселей, угол основного текста и размер файла, отмечая выбросы. Такие показатели не доказывают качество содержания, но направляют визуальный контроль к страницам, которые сильнее всего отличаются от нормы.
Финальное утверждение профиля выполняют после сборки нескольких очищенных страниц в пробный PDF и тестового OCR. На этом этапе обнаруживаются эффекты, незаметные в отдельном PGM: различная физическая величина страницы, потерянный DPI, неодинаковые поля и ухудшение распознавания мелкого текста. Профиль считается готовым только когда растры, итоговый документ и OCR согласуются между собой.
Чего не следует делать
- Не применяйте агрессивный фильтр ко всей коллекции после проверки одного удачного листа.
- Не перезаписывайте raw-файлы и не используйте очищенный результат как единственную копию.
- Не смешивайте поворот на 90 градусов с поиском малого наклона.
- Не задавайте wipe по плавающему дефекту без стабилизации положения скана.
- Не переводите иллюстрированный материал в PBM до проверки полутонов и тонких линий.
- Не оценивайте качество только по белизне фона; проверяйте сохранность символов и графики.
- Не собирайте финальный PDF до проверки количества и порядка растровых страниц.
Каждая из этих ошибок возникает из-за попытки сделать автоматический процесс универсальным. Unpaper эффективен, когда вход описан, этапы разделены, параметры проверены и исключения учитываются явно. Чем больше различается материал, тем важнее несколько небольших профилей вместо одной длинной команды с экстремальными порогами.