Что получается
Слева страница, свёрстанная вручную по старому процессу. Справа та же картинка, пропущенная через конвейер. Обе закрашены одним способом: цвет каждой области берётся из цветного образца.
Что было и что изменилось
Обе страницы измерены одним скриптом: он находит замкнутые области по линиям и чернила цифр по странице, включая бледные. Поле задания 193,7 на 274,7 мм, как в печатной книге.
| Показатель | До | После |
|---|---|---|
| Закрашиваемых областей без цифры | 8 | 0 |
| Цифр мельче 1,2 мм, не прочитать на печати | 8 | 0 |
| Бледных цифр, штрих не доходит до чёрного | 16 | 0 |
| Самая мелкая цифра | 1,02 мм | 1,23 мм |
| Зазор цифры до линии, минимум | 0,25 мм | 0,18 мм |
| Узких осколков шириной 0,5–2,4 мм | 32 | 24 |
| Областей от 1 мм² | 161 | 146 |
| Толщина линии, медиана | 0,25 мм | 0,25 мм |
| Шрифт цифр | два, «I» бледная | один, без I и O |
Главное отличие в последней проверке. На странице для сравнения дефекты остались в печати, значит их никто не поймал. Здесь готовую страницу проверяет программа по растру и отмечает подозрительные места. Человек всё равно смотрит весь рисунок: выражение лица, тени и форму программа оценить не умеет.
Почему областей стало меньше
Было 161, стало 146. Пятнадцать областей ушли, но на закрашенной картинке их не видно: обе страницы после закраски отличаются друг от друга на 12 мм² из 48 тысяч, это шесть пятен размером 1–4 мм².
- Семь крошек меньше 3,5 мм² отданы соседу. Это участок около 1,5 на 2 мм: карандашом его закрасить можно, но это одно-два касания с риском задеть соседа, а оттенок у него тот же. Цифра туда не влезает. Было 12 таких, осталось 5.
- Шесть полос уже 1,5 мм слиты с соседом того же оттенка: след карандаша 1–1,5 мм, такая полоса закрашивается одним штрихом без права на ошибку. Было 6, осталось 0.
- Остальные это соседние куски одного цвета, которые раньше были разделены линией, а теперь стали одной областью.
- Десять мелких деталей (усы, спираль, складки век) не исчезли, а стали тонкими линиями без номера: их красят цветом контура.
Откуда берутся пороги
Грифель заточенного карандаша 0,5–1 мм, след на бумаге 1–1,5 мм. Полоса шириной 1,5 мм закрашивается одним штрихом без права на ошибку, участок 3 мм² это примерно 1,5 на 2 мм, то есть одно-два касания.
Закрасить такое можно, но попасть в контур и не задеть соседа сложно, а результата на картинке не видно: эти участки того же оттенка, что сосед. Обе закрашенные страницы отличаются друг от друга на 12 мм² из 48 тысяч.
Крупных областей шире 2,4 мм почти столько же: 122 против 128. Расхождение закрашенной страницы с оригиналом даже меньше, чем раньше: средняя разница цвета 0,9 против 1,0, потому что крошки красились неточно.
Дефекты на странице до
Тот же скрипт обводит на странице всё, что нашёл. Цвет рамки или кружка говорит, какой это дефект, легенда под картой.
Что это значит для человека с карандашом
- Область без цифры. Участок закрашиваемого размера, а цвет не указан. Приходится угадывать по соседям или по образцу слева.
- Цифра мельче 1,2 мм. На печати это точка. Читается только с лупой, и легко спутать 1, 7 и I.
- Бледная цифра. Штрих тонкий и серый, до чёрного не доходит; в основном это «I» высотой 1–1,4 мм. На бумаге такая цифра почти исчезает.
- Цифра у края листа. Стоит ближе 1,5 мм к рамке. При обрезке или переплёте может уйти под край.
- Осколок уже 1,5 мм. Полоса тоньше следа карандаша: закрасить, не задев соседа, почти нельзя.
Что из этого убрано и каким шагом
| Дефект | До | После | Шаг конвейера |
|---|---|---|---|
| Область без цифры | 8 | 0 | /numberer ставит цифру по каждой замкнутой области и каждой толстой доле, /inspector проверяет. Самые большие пустые области до: 161 и 77 мм² |
| Цифра мельче 1,2 мм | 8 | 0 | /fitter: цифра не уменьшается ниже 1,2 мм, вместо этого поворот или расширение области |
| Бледная цифра | 16 | 0 | /coder: один шрифт, все цифры чёрные, буквы I и O убраны |
| Цифра у края листа | 2 | 2 | не убрано: обе страницы ставят цифру по центру области, у края он и остаётся; нужен отступ от рамки |
| Осколок уже 1,5 мм | 2 | 0 | /merger отдаёт полосу соседу того же оттенка |
Для сравнения та же карта на странице после: обведены только две цифры у края.
Как устроен конвейер
Один скрипт на Python: на входе картинка, на выходе страница, цветной образец, палитра и отчёт проверки. Все пороги заданы в миллиметрах печати, поэтому результат не зависит от размера исходника.
Проверка страницы
Программа ищет четыре вида дефектов. У обоих сюжетов после сборки все счётчики по нулям. Важно, что считается областью: замкнутый участок от 1 мм² и толще 0,5 мм. Участки мельче этого цифру вместить не могут и проверяются отдельно, как слияния.
Щель в контуре
В одной замкнутой области оказались цифры разных кодов или два цвета исходника. Такую область человек закрасит одним цветом, и картинка сломается.
Область без номера
Замкнутый участок от 1 мм², толще 0,5 мм, внутри которого нет ни одной цифры. Отдельно проверяются толстые доли одной области.
Цифра на линии
Чернила цифры задевают линию границы или тонкую линию. Проверяется по реальной маске цифры с учётом поворота.
Цифра впритык
Зазор между цифрой и линией меньше 0,15 мм. На печати такая цифра сливается с контуром.
Проверка проверяется тоже. Если убрать на странице самую большую цифру, стереть кусок линии между двумя цветами или положить цифру поверх линии, каждый из дефектов находится.
Второй сюжет
Чтобы проверить, что конвейер не подогнан под одну картинку, тем же кодом собран мультфильм с чёрным контуром. Исходник растровый, 767 px по ширине, и конвейер растягивает его до рабочей сетки.
Третий сюжет: картинка конкурента
Для проверки на чужом стиле взята картинка из карточки товара другого издателя раскрасок. Исходник растровый, 550 px по ширине, кадр со слайда карточки, а не печатный файл. Для продажи такая картинка не годится, здесь она только как тест.
Это самый тяжёлый из трёх сюжетов: расхождение закрашенного результата с оригиналом 5,0 против 0,9 у аниме-портрета. Низкое разрешение исходника и россыпь мелочи, именно то, о чём требования ниже.
Требования к исходнику
Чем лучше исходник, тем меньше работы у конвейера и меньше слияний. Всё ниже вытекает из порогов, с которыми собраны эти страницы, в миллиметрах печатного поля шириной 193 мм.
| Что | Норма | Почему |
|---|---|---|
| Разрешение | вектор или растр от 3000 px по ширине | рабочая сетка 3400 px; растр 800 px даёт зубчатые линии и теряет детали |
| Заливки | плоские, без градиентов и текстур | градиент режется на полосы, текстура на сотни крошек, всё это уходит в слияние |
| Число цветов | 12–20 | больше 20 цветов не различить на палитре, соседние оттенки сливаются |
| Самая мелкая деталь | от 1,5 мм шириной и от 3,5 мм² | след карандаша 1–1,5 мм: уже полоса красится одним штрихом без права на ошибку, а цифра 1,2 мм не влезает |
| Тонкие штрихи | допустимы, если тоньше 0,5 мм и длиннее 6 мм | усы и складки становятся линиями без номера, а не областями |
| Контраст соседей | соседние области заметно разных цветов | мелкий участок того же оттенка, что сосед, после закраски не виден, поэтому отдаётся соседу |
| Чёрный контур | или толще 0,5 мм, или его нет | толстый контур становится областями с кодом 2, тонкий превращается в линию |
| Белый и чёрный | чистый белый и почти чёрный | белый становится кодом 1 «бумага», чёрный кодом 2; кремовый белый останется обычным цветом |
| Текст и россыпь мелочи | не нужны | буквы на вывесках и ряды окошек дают десятки областей без места под цифру |
Если картинку рисует генератор
Просить плоский стиль с чёткими контурами, крупные формы, лицо и глаза покрупнее, ограниченную палитру, без теней с размытием, без фона с мелкой фактурой. Проверка простая: прогнать через конвейер и посмотреть, сколько областей ушло в слияние и сколько цифр мельче 1,6 мм.
Готовность к печати
Часть требований печати проверяется по файлу, часть видна только на бумаге. Что измерено на странице для сравнения:
| Проверка | Результат | Норма |
|---|---|---|
| Разрешение страницы при ширине 193,5 мм | 446 dpi | от 300 dpi |
| Самая мелкая цифра | 1,23 мм | не мельче 1,2 мм |
| Зазор между цифрой и линией | от 0,15 мм | от 0,15 мм |
| Растекание краски 0,05 мм: знаков, слившихся с линией | 0 из 181 | 0 |
| Областей уже 0,3 мм, которые заплывут при печати | 0 | 0 |
| Толщина линии на оттиске | 0,25 мм | 0,2–0,3 мм |
| PDF: формат, шрифты | A4, Arial встроен | встроенные шрифты |
Растекание краски имитируется утолщением всех линий и цифр на 0,05 мм с повторной проверкой зазоров. Это грубая модель лазерного принтера на обычной бумаге, не замер.
Что видно только на бумаге
- Читается ли цифра 1,2 мм на выбранной бумаге и принтере, и различима ли повёрнутая цифра.
- Видна ли разница между линией границы 0,2 мм и тонкой линией 0,13 мм.
- Требования типографии: вылеты, цветовая модель для цветной стороны, вектор вместо растра для линий.
Для этого хватит одного распечатанного листа и тестовой полосы с цифрами от 1,0 до 1,6 мм и линиями от 0,1 до 0,3 мм. По ней пороги конвейера выставляются под конкретную печать.
Что ещё не сделано
- Печать на бумаге не проверялась. Читаемость цифр 1,2 мм, повёрнутых цифр и зазора 0,15 мм видно только на распечатке.
- Страница сейчас растровая. Для типографии нужен векторный PDF с кривыми и текстом.
- Палитра не привязана к реальному набору карандашей или маркеров.
- Около тридцати порогов подобраны на трёх сюжетах, на новых они могут потребовать настройки.
- Слияние мелкого идёт по размеру и близости цвета. Контрастная мелочь (зрачки, заклёпки) защищена, но художник должен видеть список слитых участков, а не доверять сумме площадей.
- Расширения под цифру и повороты меняют форму узких деталей. Их можно отключить, тогда такие участки либо сливаются, либо остаются без цифры, и это надо выбирать осознанно.
- Сюжеты для показа построены на чужих персонажах. Для продажи нужны свои.
Замечания к странице и что с ними
- Расширения и повороты портят форму. Согласен. На аниме-портрете их 6 и 2, пять расширений стоят на заклёпках, где кружки есть и в исходной книге. Оба приёма отключаются ключами bulbs=0 rotate=0 merge_narrow=0: тогда страница сохраняет все 149 областей как есть, но 8 из них остаются без цифры, и проверка их честно показывает. Выбор за художником.
- «Ноль пропусков» ограничен порогами. Верно: область это участок от 1 мм² и толще 0,5 мм. Мельче этого цифра 1,2 мм не влезает физически. Такие участки учитываются отдельно как слияния, их список выдаётся.
- Слияние по размеру и цвету нужно контролировать глазами. Да. Защита контрастной мелочи есть, но список слитых участков с вырезками нужен как отдельный отчёт для художника.
- Человек смотрит весь рисунок. Формулировка исправлена. Программа отмечает дефекты из своего списка, оценка рисунка остаётся за человеком.
- У сравниваемой страницы есть свой контроль. Страница взята из пробного разворота, и по ней видно 8 областей без цифры и 8 цифр мельче 1,2 мм. Чей это процесс и какой версии, со страницы не видно; честное сравнение это прогон одного и того же PDF обоими проверками.
Как запустить
venv/bin/python pbn2.py src/nar_vec.png out/nar k=20 min_digit=1.6 print_w=193.5
k число цветов, min_digit нормальная высота цифры в мм, print_w ширина поля на бумаге. Ключи bulbs=0, rotate=0, merge_narrow=0 отключают расширения, повороты и слияние узких.
Одна страница собирается за одну-две минуты. Метрики против эталона считает cmp/metrics.py, PDF книги собирает build_pdf.py.