Вернуться к разделу "Материалы по сканированию и оцифровке бумажных книг".
Метод выборочной раскраски маски - это новая уникальная технология по обработке DjVu-файлов.
Авторы метода - Алексей Крюков и monday2000. Идея метода - monday2000.
Метод выборочной раскраски маски появился на свет как дальнейшее развитие метода раскраски маски.
Метод раскраски маски подарил нам принципиальную, никогда ранее не существовавшую, возможность раскраски маски DjVu-файла одним (любым) цветом - красным, синим, зелёным и т.д.
Особенность этой опции состоит в том, что при этом окрашивается весь текст (на странице DjVu-файла).
Вот как это примерно выглядит:
Этот образец Вы можете посмотреть в прилагаемом файле:
Скачать пример результата работы метода раскраски маски (897 КБ) |
Однако возникает вопрос - для чего это может быть практически нужно? Т.е. кому и зачем может потребоваться окрашивать текст на DjVu-странице - и именно весь целиком?
Исходя из реальной практики DjVu-книгосканирования, можно предположить следующее: практически никому и никогда. Разве что для текста обложки книги (и то в редчайших случаях). Или же (неизвестно для чего практически) можно инвертировать цвета DjVu-страницы (что предлагает делать опция DjVu Sepia в программе JRA Publish 3.0).
Если уж у нас и появилась принципиальная возможность раскраски маски (после создания метода раскраски маски) - то, скорее всего, это может быть реально востребовано только для выборочной окраски маски. То есть, для раскраски неких произвольных (например, прямоугольных) участков маски (или же произвольных блоков текста - что одно и то же).
С практической точки зрения, такая потребность вполне существует, и необходимость в ней так уж и редка. Например, порой в чёрно-белой книге названия глав или подписи к рисункам оформлены голубым или синим текстом. Или же рисунки соединены какими-нибудь красными стрелочками, и т.п.
Но можно ли раскрашивать элементы маски выборочно? И что они из себя представляют - эти элементы маски? Насколько они велики и сколько их на DjVu-странице? Вдруг их мало, или они большие по размеру - тогда ведь желаемая точность окрашивания будет невысока?
Для того, чтобы ответить на эти вопросы, мне пришлось более внимательно проанализировать программный код в djvumake, отвечающий за раскраску маски. Эту работу в djvumake (в методе раскраски маски) выполняет функция create_fgbz_chunk(). По моей просьбе Алексей Крюков прислал мне комментарии к этой функции:
// Создаем
палитру GP<DjVuPalette> pal = DjVuPalette::create(); // Создаем поток, из которого будут считываться данные о цветах. // В данном случае у нас единственный цвет, хранящийся в массиве // из трёх байтов. Если нужно больше цветов, то понадобилось // бы сначала записать их спецификации в массив размером n*3. GP<ByteStream> gzbs = ByteStream::create_static(stencil_color,3); ByteStream &bs=*gzbs; // Переносим данные о цветах в палитру. Второй аргумент -- количество // цветов, хранящихся в массиве. pal->decode_rgb_entries(bs, 1); // Резервируем место под данные о цвете каждого объекта (блита) pal->colordata.resize(0,blit_count-1); // А теперь для каждого блита указываем порядковый номер // сопоставленного ему цвета в массиве цветов. В данном случае цвет // только один, поэтому индекс всегда нулевой. for (int d=0; d<blit_count; d++) pal->colordata[d] = 0; // Сбрасываем готовую палитру в файл. iff.put_chunk("FGbz"); pal->encode(iff.get_bytestream()); iff.close_chunk(); -- Regards, Alexey Kryukov <anagnost at yandex dot ru> Moscow State University Historical Faculty |
Из этого кода хорошо видно, как работает раскраска маски (т.е. всей целиком): генерируется чанк-расцветка (чанк FGbz) для всей маски DjVu-файла. Для этого из слоя маски (чанк Sjbz) считывается информация о т.н. "блитах" (в этом коде не показано) и на её основании создаётся "с нуля" раскрашивающий блок-палетка FGbz.
Блит - это указатель на т.н. "шейп" (shape - англ.). Шейп - это мельчайший связный объект маски, подлежащий расцветке, т. е. отдельный знак (буква) или его часть. Блиты и шейпы DjVu-страницы организованы в массивы. При этом одни и те же шейпы могут быть разделены между несколькими DjVu-страницами (порождая словарь разделённых символов). Более подробно об этом можно почитать в файле JB2Image.h (в исходниках DjVuLibre).
Таким образом, становится ясно, что блиты и их цвета с программной точки зрения - это просто некие массивы элементов, и более того - оказалось, что этими элементами массивов можно свободно манипулировать (!).
Но насколько велики размеры блитов (и, как следствие, возможная точность их раскраски)?
Чтобы ответить на этот вопрос, я первым делом сделал специальную "техническую" версию djvumake - предназначенную для "визуализации" всех шейпов DjVu-страницы. Эта утилита раскрашивает все блиты на заданной DjVu-странице в красный, синий, зелёный цвета "по кругу". Благодаря этому становится возможным увидеть визуально все шейпы - и таким образом, заранее оценить возможности по их раскраске.
Вот как это примерно выглядит:
Этот образец Вы можете посмотреть в прилагаемом файле:
Скачать пример результата визуализации маски (30 КБ) |
Каждый шейп на этом рисунке окрашен в собственный цвет - отличающийся от цвета окраски соседних шейпов.
Из этого рисунка хорошо видно, что такое шейпы, и как они выглядят. Как уже говорилось, шейп - это мельчайшая связная область маски. Каждый шейп можно раскрасить в один цвет. Из рисунка видно, что шейпы, по счастью, оказались достаточно малы по размерам - а значит, становится принципиально возможным раскрасить текст маски практически любым желаемым образом - в смысле, с достаточной точностью ("до буквы")!
Теперь о том, как узнать, сколько шейпов имеется на данной DjVu-странице. Их общее количество можно увидеть в "Информация о странице" в WinDjView. В случае "раскрашенной" DjVu-страницы там есть запись вида:
0,0 Kb 'FGbz' JB2 foreground colors (1 color, 3359 ccs).
|
Общее количество блитов страницы в такой записи выводится перед словом "ccs". В данном случае на этой DjVu-странице у нас имеется 3359 блитов.
Скачать визуализирующую djvumake можно здесь:
Скачать модифицированную версию djvumake (визуализирующую) (вместе с исходником) (146 КБ) |
Для того, чтобы самостоятельно воспользоваться этой утилитой, проще всего вставить её в DjVu Imager - на замену имеющейся там djvumake. И тогда на всех страницах, куда Вы будете вставлять картинки, шейпы будут "визуализироваться".
А можно просто заменить ею djvumake в консольных утилитах метода раскраски маски (если Вы хотите визуализировать шейпы произвольной страницы DjVu-файла - т.е. не обязательно только те, где есть картинки "под DjVu Imager"). В этом случае утилите нужно указать на входе какой-нибудь цвет (любой) - программа его проигнорирует и при этом визуализирует блиты.
Остаётся вопрос - если мы хотим выборочно окрашивать блиты DjVu-страницы какими-то участками в разные цвета - то как мы будем задавать желаемые области раскраски?
Оказывается, каждый блит имеет 2 координаты - описывающие положение соответствующего ему шейпа на DjVu-странице. А, значит, можно задать некие покоординатные зоны раскраски (например, с разными цветами) - и окрашивать в соответствующие цвета те блиты, координаты которых попадают в соответствующую зону.
Именно этот подход и вылился в итоге в новый метод - метод выборочной раскраски маски.
Выборочность метода состоит в возможности задать на входе djvumake неограниченное количество "зон раскраски". При этом каждая такая зона характеризуется такими параметрами, как цвет и 4 координаты (относительно верхнего левого угла DjVu-страницы
Эту работу выполняет модифицированная утилита djvumake. Я модифицировал параметр FGcolor следующим образом:
FGbz=#color1:x,y,w,h#color2:x,y,w,h#color3:x,y,w,h или FGbz=#color1:x,y,w,h#color2#color3:x,y,w,h (зоны могут покрывать всю страницу)
|
Параметры x,y,w,h - это координаты текущей зоны на странице. x,y - координаты верхего левого угла зоны, w,h - ширина и высота зоны.
Для примера из статьи о методе подклейки фона параметры командной строки djvumake будут выглядеть так:
djvumake 1.djvu INFO=2479,3507,300 INCL=3.djbz Sjbz=Sjbz.cnk FGbz=#red:185,903,1097,525#green:928,1582,1046,329#blue:464,2186,1332,468 BG44=BG44.cnk
|
Вот как это примерно выглядит:
Этот образец Вы можете посмотреть в прилагаемом файле:
Скачать пример результата работы метода выборочной раскраски маски (22 КБ) |
Положение и цвет любой из зон окрашенного текста можно задавать произвольно. Один и тот же кусок текста можно окрашивать по нескольку раз - т.е. разными зонами (зоны считываются слева направо из командной строки и в таком же порядке и применяются к DjVu-странице). Количество зон - неограниченно.
ВАЖНО: К сожалению, пока что точность действия зон раскраски недостаточна - плюс-минус строка/ряд блитов (по периметру зоны). Дело в том, что каждый шейп имеет не только координаты - но также ещё и размеры. Размеры шейпов пока никак не учитываются (это нужно будет ещё реализовать в будущем - тогда точность действия зон будет идеальной). Пока же старайтесь выделять окрашиваемые блиты в зоны "с запасом" (т.е. чтобы эти блиты точно попали в зону).
Скачать модифицированный исходник утилиты djvumake (скомпилированный в готовую к работе программу) можно здесь:
Скачать модифицированную версию djvumake (выборочная раскраска) (вместе с исходником) (146 КБ) |
Для визуальной расстановки зон можно использовать, например, СканКромсатор. Для этого нужно декодировать раскрашиваемую чёрно-белую DjVu-страницу в формат TIF (BMP), загрузить полученный файл в СканКромсатор, расставить и применить Picture-зоны, экспортировать их координаты, назначить им цвета, слегка переформатировать их синтакс - и подать на вход новой djvumake.
Конкретно алгоритм выглядит так:
1. Загрузить раскрашиваемую страницу в СканКромсатор.
2. Нажать кнопку Clear all options and mark all files.
3. Установить Picture-зону (можно несколько на одной странице).
4. Нажать кнопку Process!
5. Выбрать в меню: Zones -> Picture zone -> Export zones location...
6. В папке out появится файл zones.txt с примерно таким синтаксисом:
File = C:\out\0001.tif Id = 1, (274,1036,1498,1644); pic.0001.tif
|
Координаты зоны раскраски (под новый djvumake) для этого примера можно вычислить так:
x = 274
y = 1036
w = 1498 - 274 = 1224
h = 1644 - 1036 = 608
В результате командная строка для djvumake будет выглядеть примерно так:
djvumake 1.djvu INFO=2479,3507,300 INCL=3.djbz Sjbz=Sjbz.cnk FGbz=#red:274,1036,1224,608 BG44=BG44.cnk
|
Результат раскраски будет идентичен характеру расстановки Picture-зон в СканКромсаторе.
Метод выборочной раскраски маски - это совершенно новая и полностью уникальная технология. Она (на данный момент) не реализована ни в одной другой существующей DjVu-программе.
Возможность выборочной раскраски маски в уже готовом DjVu-файле представляется, на мой взгляд, довольно интересной и практически-полезной.
Сейчас чёрно-белые книги со вставками цветного текста приходится обрабатывать довольно сложным образом: на этапе сканобработки в СканКромсаторе выделяются блоки цветного текста - в специальные Picture-зоны, затем специальным (и довольно неудобным) образом их обрабатывают (раскрашивают), и т.д. Всё это порождает дополнительные проблемы и неудобства.
Метод же выборочной раскраски маски позволит перенести процедуру раскраски цветного текста с этапа сканобработки на этап постобработки уже готового DjVu-файла.
Это даст возможность проводить сканобработку чёрно-белых книг со вставками цветного текста обычным образом - как будто это просто полностью чёрно-белые книги (т.е. без вставок цветного текста). В результате значительно упростится сканобработка, повысится гибкость и точность обработки блоков цветного текста, снизится ошибочность их обработки.
Также становится возможным применить (для DjVu-кодирования чёрно-белых книг со вставками цветного текста) свободно-бесплатный кодировщик miniDjVu (который умеет кодировать в DjVu исключительно чёрно-белые сканы) - вместо коммерческих DjVu-кодировщиков.
Возможности метода выборочной раскраски маски уже превосходят возможности опции DjVu Sepia в программе JRA Publish 3.0 (которая эквивалентна лишь простому методу раскраски маски).
Я уж сообщил Леону Боту о создании метода выборочной раскраски маски. Он одобрил новый метод и пообещал найти время, чтобы протестировать и (при необходимости) доработать его.
Леон Боту переработал мою реализацию метода выборочной раскраски маски в соответствии со своими предпочтениями и выложил новый исходник в CVS DjVuLibre.
Леон добавил туда учёт размеров (длины и ширины) каждого шейпа (что я и предлагал). Точнее, учёт габаритов каждого шейпа (габариты шейпа - это длина и ширина прямоугольника, описанного вокруг шейпа).
По идее, теперь точность действия зон должна возрасти (это нужно ещё тестировать).
ВАЖНО: Леон выбрал стратегию "раскрашивать те блиты, габариты шейпа которых КАСАЮТСЯ зоны раскраски". Альтернативная стратегия - "раскрашивать те блиты, габариты шейпа которых ПОЛНОСТЬЮ ПОПАДАЮТ в зону раскраски" была отвергнута Леоном по какой-то причине.
Также слегка поменялся синтаксис связки со СканКромсатором. Теперь это выглядит так:
Для следующего файла zones.txt:
File = C:\out\0001.tif Id = 1, (274,1036,1498,1644); pic.0001.tif
|
Координаты зоны раскраски (под новый djvumake от Леона Боту) можно вычислить так:
x = 274
y = page_height - 1644 (где page_height - высота страниц в пикселях). Допустим, page_height = 3507. Тогда y = 3507 - 1644 = 1863.
w = 1498 - 274 = 1224
h = 1644 - 1036 = 608
В результате командная строка для djvumake будет выглядеть примерно так:
djvumake 1.djvu INFO=2479,3507,300 INCL=3.djbz Sjbz=Sjbz.cnk FGbz=#red:274,1863,1224,608 BG44=BG44.cnk
|
Результат раскраски будет идентичен характеру расстановки Picture-зон в СканКромсаторе.
Скачать модифицированный исходник утилиты djvumake (скомпилированный в готовую к работе программу) можно здесь:
Скачать модифицированную Леоном Боту версию djvumake (выборочная раскраска) (вместе с исходником) (152 КБ) |
Я модифицировал последнюю доступную в CVS DjVuLibre утилиту djvumake с целью придать ей свойство частичного сохранения старой раскраски (если таковая имеется).
Другими словами, если страница DjVu-файла, подлежащая раскраске, уже раскрашена (т.е. имеет FGbz-чанк), то стандартная djvumake просто отбрасывает имеющийся FGbz-чанк, генерирует "с нуля" новый (по раскрашивающим зонам) и вставляет его в DjVu-файл.
Моя модификация (я назвал её djvumakem) сохраняет старую раскраску (старый FGbz-чанк) и просто рисует поверх неё новую раскраску (создавая таким образом новый FGbz-чанк с учётом данных старого FGbz-чанка).
Это необходимо для корректировки раскраски чужих DjVu-файлов, скаченных из Интернета, а также для "итеративной" раскраски своих DjVu-файлов ("подкрасил - посмотрел, что получилось", "подкрасил - посмотрел, что получилось", и т.д.).
В отличие от djvumake, djvumakem имеет дополнительную опцию FGbz_old. При этом, если эта дополнительная опция указывается, то она обязательно должна предшествовать в командной строке опции FGbz. В FGbz_old указывается путь к старому чанку FGbz.
Командная строка для djvumakem может выглядеть примерно так:
djvumakem 1.djvu INFO=,,300 INCL=3.djbz Sjbz=Sjbz.cnk FGbz_old=FGbz.cnk FGbz=#0000ff:384,4470,1501,1185#ff0000:1141,3242,2220,763 BG44=BG44.cnk
|
Скачать исходник утилиты djvumakem (скомпилированный в готовую к работе программу) можно здесь:
Скачать djvumakem (вместе с исходником) (151 КБ) |
К сожалению, Леон Боту посчитал, что подобную модификацию djvumake не следует вносить в состав DjVuLibre, поэтому мне и пришлось давать ей специальное название ("djvumakem").
Единственное улучшение, которое Леон согласился принять в состав DjVuLibre - это автоматическая генерация (в случае необходимости) пустого (белого) заднего фона - если не указан чанк BG44 (в командной строке); а также Леон аналогично добавил ещё и автоматическую генерацию минимальной расцветки (чёрная) - если не указан чанк FGbz. Леон уже внёс это улучшение в CVS DjVuLibre.
Автор: monday2000.
6 августа 2009 г.
E-Mail (monday2000 [at] yandex.ru)