Ю.Л. Костюк, Ю.Л. Новиков
ГРАФОВЫЕ МОДЕЛИ ЦВЕТНЫХ РАСТРОВЫХ ИЗОБРАЖЕНИЙ ВЫСОКОГО РАЗРЕШЕНИЯ
Рассматривается универсальная векторная модель многоцветных растровых изображений. Предлагаются эффективные алгоритмы ее построения, основанные на триангулированном представлении векторной модели растра. Рассматриваются аспекты практического применения предложенных алгоритмов.
Решение задачи векторизации многоцветного картографического изображения может быть выполнено двумя путями. Первый- применение специальных аппаратно-программных средств для получения набора бинарных растров, каждый из которых получен выделением из исходного многоцветного растра только тех пикселей, которые имеют заданный или близкий к заданному цвет. Затем происходит последовательная векторизация каждого из полученных бинарных растров, например с применением технологий, описанных в [1, 2]. Главным недостатком такого решения является независимость друг от друга полученных векторных слоев, из-за чего возникает необходимость последующего совмещения полученных наборов объектов на одном листе электронной карты.
Второй путь решения задачи векторизации - построение комплексной векторной модели исходного многоцветного изображения, состоящей из топологически связанных векторных моделей объектов разных цветов. Для реализации данного решения авторами предложена модель «-цветного растра и алгоритмы ее построения, изложенные в [3].
В данной работе предлагается первичная модель многоцветного растра и алгоритмы ее построения. Из этой модели возможно эффективное формирование комплексной векторной модели.
Предобработка растра
Пусть имеется многоцветный растр Р, который можно представить матрицей }Мх№ где Л,=(г£,Ь) - трех-
компонентный вектор, в котором компоненты г, g, Ь представляют собой значения интенсивностей красного, зеленого и синего цветов в точке растра (і у) соответственно, заданные целыми числами в диапазоне от 0 до I. Как правило, этот формат используется при получении сканированных изображений цветных карт. При сканировании на получаемый растр попадает шумовая составляющая - случайное изменение значений интенсивностей цветовых составляющих во многих точках растра.
Для построения векторной модели такого растра необходимо привести его к виду О=^у}мх.Ы, где g у -
целое число в диапазоне от 0 до В, представляющее собой индекс - номер цвета в палитре базовых цветов Р = {(гЬ, gЬ,ЬЬ)}, і = 1,В. Растр О, с одной стороны, не должен содержать шумовой составляющей, т.е. большинство значимых для пользователя объектов растра Р должны присутствовать на растре О в виде связных областей одного цвета без «шума». С другой стороны, растр О должен с необходимой для пользователя точностью (без «размытия границ») моделировать объекты на исходном растре.
Решение задачи в общем случае является достаточно трудной задачей, однако в некоторых случаях, когда можно «пожертвовать» небольшими отклонениями получаемых векторных моделей (на величину одного пикселя) в пользу очистки изображения от шума, может быть применен следующий трехэтапный подход.
На первом этапе к изображению Р применяется обычный фильтр усреднения пикселей в 8-окрестности или больших окрестностях, с получением рас-
тра Р. Растр Р имеет меньшие амплитуды шумов на изображениях объектов, и, кроме того, более размытые, чем на исходном растре, границы областей.
На втором этапе к изображению Р применяется фильтр «постеризации», задача которого - уменьшение количества цветов на растре до заданного (как правило, небольшого) числа. В общем виде это выполняется так. Задается максимальное количество цветов (обозначим его птах), которое необходимо получить, на основе этого максимума рассчитывается число диапазонов для каждой цветовой компоненты, так что произведение этих чисел дает птах. В простейшем случае числа диапазонов для цветовых компонент можно положить равными корню третьей степени из птах. Далее весь ряд значений каждой цветовой компоненты разбивается на полученное число диапазонов этой компоненты одинакового размера.
Затем формируется растр Р", каждый пиксель которого получен из соответствующего пикселя растра Р применением значений каждой из цветовых компонент к среднему значению по тому диапазону данной компоненты, в который попало данное значение. В результате растр Р" будет содержать пиксели не более птах различных цветов.
На последнем, третьем этапе, выполняем формирование палитры Р растра Р' - пронумерованного набора цветов, встречающихся на растре Р", - и формируем растр О, содержащий индексы (номера) цветов соответствующих пикселей растра Р" в палитре Р.
Данный подход, наряду с достоинством - уменьшением шума на получаемом изображении и уменьшением количества используемых цветов, имеет и недостаток -возможность непрогнозируемого сдвига получаемых на растре объектов на величину один-два пикселя. Это происходит потому, что соседние, близкие по значениям цвета объекты на растре в результате фильтра усреднения получают размытую границу, которая на этапе «по-стеризации» может принять значение одного или другого цвета, после чего произойдет границы объекта смещаются. Поэтому наиболее эффективно применение интерактивной процедуры выбора параметров усреднения и «постеризации» с непосредственным участием пользователя. Вкратце суть данной процедуры состоит в следующем: пользователю предлагается возможность диалогового изменения значений параметров в заданном диапазоне с одновременным отображением результата работы алгоритма при заданных параметрах на небольшом участке растра или на уменьшенной копии растра.
Построение векторной модели цветного растра
Будем считать, что в растре О имеются пиксели, каждому из которых приписан какой-либо из цветов палитры Р.
Поставим задачу построения векторной модели такого растра. Требуется построить планарный граф линий (ПГЛ) и снабдить его элементы необходимым атрибутивным описанием так, чтобы иметь возможность по значениям атрибутов выполнять выборку элементов графа и эффективно формировать из нее графические объекты, значимые для пользователя (точечные, линейные и полигональные). Образы формируемых объектов на плоскости должны соответствовать с заданной точностью образам объектов на исходном растре.
Определение. Полигональная графовая модель (ПГМ) задается тройкой М=(¥Д,Е), где
V - множество точек плоскости, являющихся вершинами ПГЛ;
Я - множество ребер, каждое из которых соединяет две вершины из V, причем изображения ребер из Я на плоскости не пересекаются, поэтому (УЯ) представляет собой планарный граф;
Е - множество граней ПГЛ, которые представляют собой многоугольники, образованные ребрами из Я таким образом, что любая пара многоугольников либо не пересекается на плоскости (за исключением, быть может, граничных точек), либо один многоугольник находится внутри другого. При этом все множество многоугольников Е покрывает всю плоскость исходного растра.
Для полноты описания растра в V включаются четыре точки плоскости, соответствующие четырем угловым точкам прямоугольного растра, а в Я - четыре отрезка, соединяющие эти четыре вершины (то есть отрезки, соответствующие границам растра).
Грани ПГМ будем называть также полигонами.
Элементы ПГМ перенумеровываются и снабжаются следующими атрибутами:
- вершина графа имеет список всех смежных ей ребер;
- ребро графа имеет номера двух граней, расположенных по обе стороны от него;
- грань задается ребрами, образующими его границу, и имеет атрибут - номер цвета в палитре цветов растра О, область которого покрывается данной гранью, кроме того, грань имеет список номеров граней, расположенных на плоскости внутри нее. При этом, если грань а содержит грань Ь, а грань Ь -с, то номер с включается только в список Ь, образуя, таким образом, «дерево вложенности» граней.
Для построения векторной модели растра предлагается описываемый далее алгоритм. Вначале формируется растр В с изображением границ связных областей одного цвета. Элементы растра В={Ьу}, который имеет размеры (М+1)х(Л/+1), можно представить располагающимися в узлах прямоугольной сетки, образованной границами между пикселями исходного растра, как показано на рис. 1.
Пиксели растра границ
Рис. 1. Исходный растр и растр границ
Элементы растра В должны содержать пять признаков, каждый признак может принимать одно из двух значений (присутствует или нет соответствующая характеристика в данной точке растра В). Эти признаки таковы: Ь - признак границы; V - признак узловой точки IIIМ; / -признак того, что граница в данной точке уже просмотрена алгоритмом; с - признак узловой граничной точки; ё - признак удаленной вершины. Поэтому при программной реализации элементы растра В удобно представлять в виде массива битов, например байта.
При работе алгоритма некоторым пикселям растра О будет приписано нулевое значение (несуществующий цвет в палитре цветов растра О).
Для описания алгоритма удобно сделать следующее определение.
Определение. Назовем граничной линией на растре В такую ломаную линию, образованную точками растра, что соседние узлы этой ломаной являются 4-соседями на растре В, и каждый отрезок ломаной проходит между пикселями разных цветов на растре О при условии, что более длинной ломаной, включающей в себя все точки исходной ломаной, построить нельзя (т.е. граничная линия является максимальной по включению). Пример граничной линии приведен на рис. 2.
Алгоритм построения ПГМ заданного растра.
Исходный растр: О={£у}Мх№
Параметр 5 - «точность» получаемой модели по отношению к исходному растру. Задается в диапазоне 5>0, рекомендуемый из практики диапазон 0<5<4. Задается максимум отклонения полученной векторной линии от границы объекта на растре. Масштаб по отношению к размерам пикселей растра 5=1 означает отклонение на размер одного пикселя.
Шаг 1. Формируем растр В с изображением границ связных областей одного цвета.
1.1. Последовательно просматриваются все точки растра О, и для каждой точки а4=Яу анализируются три соседних пикселя: о^Ян/, ОГЯуч (для точек
растра О, имеющих одну или обе координаты, равные 1, величины Яь я2, я3 соответственно полагаются равными индексу несуществующего на растре цвета).
Вычисляем п как число верных неравенств из набора: Я1^?2, й^й, £3^£4, £2^£4. п может принимать значения 0, 2, 3 или 4.
Если п=0, то все признаки элемента Ь/ устанавливаются равными 0. Если п=2 (это содержательно означает, что элемент Ь / находится на границе между двумя областями разных цветов на растре О), то признак Ь элемента Ь / устанавливается в 1, все остальные сбрасываются в 0. Если п>2, то содержательно это означает, что элемент Ь/ находится в точке, в которой граничат три или четыре области разных цветов, и тогда признаки Ь и с элемента Ь / устанавливаются в 1, остальные сбрасываются.
1.2. Последовательно просматриваются точки Для каждой из них анализируется соседний слева пиксель. Если то признак с элемента ЬмЛ/ устанав-
ливается, иначе - он сбрасывается. Признак Ь для всех
Ь
М+у
устанавливается, а V, і и С сбрасываются.
1.3. Аналогично просматриваются точки Для каждой из них анализируется соседний сверху (й-щ) пиксель. Если их значения равны, то признак с элемента Ь ф+\ устанавливается, иначе - сбрасывается. Также для всех Ь N+1 признак Ь устанавливается, а /, V и ё - сбрасываются.
Шаг 2. Формирование начального набора узловых точек.
Создается пустое множество вершин V.
Последовательно просматриваются все пиксели растра В, и если признак с пикселя Ь / установлен, то в V добавляется вершина с координатами (у). При этом признак V пикселя Ь / устанавливается.
Шаг 3. Построение граней, ребер и формирование избыточного набора вершин.
3.1. Создается копия начального множества вершин, Ун=К
3.2. Для каждой вершины V из ^ выполняются в цикле шаги 3.2.1 - 3.2.3.
3.2.1. Находим на растре В пиксель Ь / , где (/ /) -координаты V. Этот пиксель соответствует точке, в которой на растре О соседствуют три или четыре цвета, например, как показано на рис. 3.
Пиксель растра в
Пиксель
Ь
Рис. 3. Пиксель на растре О, значение которого проверяется
3.2.2. В цикле просматриваем 4-соседей точки ( ,у) на растре В в следующем порядке: снизу, справа, сверху, слева. (в направлении против часовой стрелки), пока не найдем пиксель Ьи с установленным признаком Ь. Проверим, какое значение имеет пиксель растра О, расположенный между пикселями Ьу и Ьи и справа от отрезка (іу)-(р,д), как показано на рис. 4.
Искомый пиксель gc
Рис. 4. Пиксель на растре О, значение которого проверяется
Если его значение не равно 0, то сохраняем значение этого пикселя в переменной СI и выходим из цикла. Иначе - переходим к следующему шагу цикла по пикселям Ьрц
3.2.3. Восстанавливаем границу области одного цвета растра О, которой принадлежит пиксель й©. Для этого вызываем алгоритм построения границы области растра О (описываемый ниже) с параметрами: текущая точка - (у), следующая точка -(р,^).
3.3. Завершение обхода области на растре О. На этом шаге создаем новую грань Р, задавая ее набором ребер ЯР и индексом цвета Сг.
Шаг 4. Построение векторных моделей изолированных замкнутых граничных линий.
Просмотрим последовательно пиксели растра В в поисках пикселя с установленным признаком Ь и сброшенным /. Создаем вершину в этой точке и добавляем ее в множество Уц. Далее выполняем все действия по обходу граничной линии, описанные на шаге 3, начиная с текущей точки. После выполнения этих действий возвращаемся к поиску пикселя с установленным Ь и сброшенным /.
Шаг 5. Уменьшение количества вершин ПГМ (генерализация). К полученной модели растра применяем алгоритм генерализации полной ПГМ, описанный ниже.
Конец алгоритма построения ПГМ.
Сделаем некоторые пояснения к алгоритму.
На шаге 3 строится большинство ребер ПГМ так, что на плоскости эти ребра будут точно соответствовать границам между связными областями точек растра одного цвета. При этом полученные ребра не пересекают такие связные области.
Как нетрудно заметить, на шаге 3 будут построены векторные модели только тех граничных линий, которые имеют точки пересечения с другими граничными линиями. Для построения векторных моделей оставшихся изолированных граничных линий (которые будут замкнутыми) предназначен шаг 4, на котором выполняются те же действия, что и на шаге 3, но для еще не векторизованных контуров.
Результат работы шагов 3 и 4 представляет собой полную векторную модель граничных линий и областей, которая, однако, слишком избыточна. Для уменьшения этой избыточности могут быть предложены самые разнообразные алгоритмы, причем выбор конкретного алгоритма напрямую зависит от специфики решаемых при векторизации задач.
Рассмотрим алгоритм генерализации, основанный на подходе, описанном в [4].
Определим объекты, которые необходимо подвергнуть генерализации. Рассмотрим множество вершин ПГМ V. Вершины, которым инцидентны три или четыре ребра ПГМ, не следует удалять из ПГМ, так как они несут существенную информацию - точки стыковки областей трех или четырех различных цветов. Вершины, которым инцидентны только два ребра, могут быть удалены, если получаемые ребра отклоняются от исходной граничной линии не более чем на 5. При этом уменьшается как количество вершин, так и ребер. Количество граней ПГМ остается неизменным. Таким образом, задача предлагаемого алгоритма - удаление из ПГМ вершин с валентностью два, которое не приводит к отклонению получаемых ребер от исходной границы на растре на величину более 5.
После завершения шага 5 алгоритма построения ПГМ у нас имеется генерализованная ПГМ, заданная множествами вершин V, ребер Я и множеством граней Е
Алгоритм генерализации полной ПГМ.
Перебираем в цикле вершины из множества Ун и выполняем для них шаг 1.
Шаг 1. Пусть выбранная из вершина - w-i. Просматриваем все ребра, инцидентные w0 (их может быть три или четыре), и в цикле выполняем для них шаг 2.
Шаг 2. Имеем вершину Wl и ребро, инцидентное ей, которое обозначим г1. Сформируем временные списки
вершин (V) и проходящих между ними ребер (Я) следующим образом. Начиная от вершины Wl и ребра гь находим противоположную текущей вершину, инцидентную текущему ребру, и заносим ее во временный список V. В список Яґ заносим текущее ребро. Если все ребра, инцидентные текущей вершине, имеют длину больше одного пикселя, то помечаем данную вершину как неудаляемую. Если новая вершина имеет валентность 3 или более, то выходим из цикла, иначе - находим ребро, инцидентное новой вершине, но не совпадающее с текущим. Делаем новую вершину и найденное ребро текущими и повторяем шаг цикла.
Шаг 3. Находим первую неудаляемую вершину в списке V, которой необходимо является вершина Wl. Просматриваем список Vґ и находим следующую неудаляемую вершину. Обозначим ее w2. Такая вершина всегда найдется, по крайней мере, неудаляемой является последняя вершина списка V. Все вершины и ребра, находящиеся между первой и второй неуда-ляемыми вершинами, заносим в порядке их следования в список Ж©. Переходим к следующему шагу с параметрами w(н)=wь W(K)=W2, Ж=Ж©.
Шаг 4. Генерализация ломаной, заданной неуда-ляемыми концевыми точками W(H) и W(к) и набором промежуточных точек Ж.
4.1. Среди набора Ж выбираем точку, наиболее удаленную от отрезка обозначим ее wD.
Пример такой точки приведен на рис. 5.
Если расстояние от wD до отрезка ^(щ^^) меньше 5, то переходим к выполнению шага 4.2. Иначе - переходим к выполнению шага 4.3.
Рис. 5. Граничная линия и точка с наибольшим отклонением от отрезка между начальной и конечной точками
4.2. Считаем, что по условию генерализации ломаную можно заменить отрезком^^^^), поэтому выбираем из ПГМ все вершины из Ж, а также все ребра, инцидентные Ж, и заменяем их одним ребром ^(Н)^(К)). Перед заменой определяем, какие грани находились по обе стороны от ломаной (номера этих граней содержатся в атрибутах любого ребра ломаной, например, соединяющегоw(H) с первой вершиной из Ж), и приписываем соответствующие значения атрибутам вновь созданного ребра ^(Щ^)). Вносим соответствующие изменения в списки ребер левой и правой граней рассматриваемой ломаной. Завершаем работу алгоритма.
4.3. Объявляем точку wD неудаляемой и рекурсивно применяем шаг 4 со следующими параметрами: W(H) - та же; параметр W(K)) принимает значение wD; параметр Ж принимает значения подсписка Ж ^^...^ч), где к - индекс wD в списке Ж.
Затем рекурсивно применяем шаг 4, используя следующие параметры: вместо W(H) используется wD; в качестве параметра W(K) используется текущее значение W(K);
в качестве Ж используется подсписок (^к¥1, wk+2,.., wn) исходного списка Ж, где к - индекс wD в списке Ж, а п -индекс последней вершины в списке Ж.
Конец алгоритма.
Приведем описание алгоритма построения границы области растра О.
При работе алгоритма создается очередь Q, предназначенная для хранения максимум трех пикселей растра В. Напомним, очередь представляет собой структуру данных, элементы которой линейно упорядочены, добавление элементов в которую происходит с одного конца, а удаление - с другого.
Алгоритм построения границы области одного цвета растра О.
Параметры: текущая точка на растре В - Ьу, следующая точка - Ьм.
Шаг 1. Создаем пустую очередь Q. Выполняем в цикле шаг 2.
Шаг 2. Очищаем очередь р и помещаем в нее текущую точку. Проверяем, установлен ли признак ґ пикселя Ьп. Если нет, то выполняем шаг 3. Иначе-выполняем шаг 4.
Шаг 3. Выполняем создание ребер, проходящих вдоль данной граничной линии, в цикле перемещая текущую точку по пикселям растра В, у которых установлен признак Ь. В точках ветвления и пересечения выбираем самое правое относительно текущего направление. При этом выполняем (в цикле) следующие действия.
3.1. Во всех пикселях растра В, по которым прошел алгоритм, устанавливаем признак ґ.
3.2. В начальной точке движения устанавливаем, кроме того, признак V.
3.3. В пикселях растра О, расположенных между текущей и предыдущей точкой на растре В, справа по отношению к отрезку от предыдущей к текущей точке, записываем значение 0 (индекс несуществующего цвета).
3.4. Если в текущей точке с координатами (1,г) граничная линия изменяет направление, то создаем вершину ПГМ с координатами (1,г) и помещаем ее в множество V; создаем ребро, начинающееся в предыдущей вершине на этой граничной линии и оканчивающееся во вновь создаваемой вершине. У пикселя Ьг устанавливаем признак V.
3.5. Если в текущей точке пиксель Ьг имеет установленный атрибут с, то в данной точке существует вершина, принадлежащая множеству ^; находим ее и создаем ребро, оканчивающееся в точке (1,г).
3.6. Все вновь создаваемые на шагах 3.4, 3.5 ребра заносим во временный список ребер ЯЕ.
3.7. Если признак С пикселя Ь у не установлен, то заносим пиксель Ьу в очередь Q. Последний элемент очереди удаляется.
3.8. Если элементы очереди Q представляют собой одну из конфигураций, изображенных на рис. 6, то удаляем пиксель q2 из очереди Q и выполняем коррекцию вершин и ребер следующим образом. Если в Vн существует вершина, имеющая те же координаты, что и q-i то удаляем из Vн вершину, имеющую координаты q2, и ребро q1-q2 заменяем ребром ql-qз. Иначе (д1 не является вершиной) изменяем координаты вершины q2 так, чтобы они стали равными q1. Признак С пикселя растра В, имеющий координаты q2, устанавливается.
Рис. 6. Изменяемые конфигурации точек на граничной линии:
Чь Ч2, Чз - элементы очереди Q.
Текущая точка совпадает с д3; х - пиксель растра О.
3.9. Если текущая точка - начальная точка движения, то создаем последнее ребро, оканчивающееся в начальной вершине, выходим из цикла и завершаем работу алгоритма.
3.10. Как только текущий пиксель имеет установленный признак ґ, создаем вершину в точке (1,г), соответствующее ребро и выходим из цикла.
Шаг 4. Текущая граничная линия уже создана, о чем свидетельствует признак ґ, поэтому просто отслеживаем ее. Для этого так же, как и на шаге 3 в цикле, двигаемся вдоль граничной линии, выполняя следующие действия.
4.1. В начальной точке движения, которая обязательно соответствует вершине из УН, находим ребро, идущее в том же направлении, что и рассмотренная граничная линия. Заносим это ребро в список КР и сразу перемещаемся в другую вершину этого ребра.
4.2. В текущей точке, которая обязательно соответствует вершине, принадлежащей либо УН, либо У, выбираем граничную линию, направление которой -самое правое по отношению к текущему направлению. Если следующая на этом направлении точка имеет установленный признак ґ, то так же, как и в случае 4.1, выбираем ребро, идущее в том же направлении, что и рассматриваемая граничная линия.
Заносим это ребро в список ЯР и сразу перемещаемся в другую вершину этого ребра. Если же следующая на этом направлении точка не имеет установленного ґ, то переходим к выполнению шага 1, не перемещаясь в новую точку.
4.3. Если текущая точка - начальная точка движения, то выходим из цикла и завершаем работу алгоритма.
4.4. При движении вдоль ребер, найденных на шагах 4.1 и 4.2, в пиксели растра О, находящиеся справа от ребер, записываем 0 (индекс несуществующего цвета).
Конец алгоритма.
Триангулированное представление ПГМ
Выше был описан алгоритм построения ПГМ, результат работы которого - наборы вершин, ребер и граней - при практической реализации представляются в виде простых структур данных - списков или массивов.
Однако при частых операциях выборки элементов ПГМ по заданным координатам на плоскости поиск подходящих объектов в неупорядоченных списках
становится неэффективен. Рассмотрим триангулированное представление ПГМ, позволяющее эффективно реализовать операции выборки и регионального поиска элементов ПГМ, что имеет важное значение при объектной векторизации.
Определим триангулированное представление ПГМ как триангуляцию Т, построенную на множестве точек плоскости - вершин ПГМ - У таким образом, что все ребра из множества ребер ПГМ Я входят в триангуляцию Т в качестве ее ребер, а грани ПГМ представляют собой множества смежных треугольников триангуляции.
Построенная таким образом триангуляция представляет собой структуру Т=(УЯиЯЛ,0), где У - исходное множество вершин; Я - множество ребер - ограничений триангуляции; Яи - множество ребер, построенных в процессе триангуляции, © - множество треугольников, заданных вершинами и ребрами, их образующими. Ребра из Яи будем называть «невидимыми ребрами», так как они являются внутренними для процесса построения ПГМ и невидим для пользователя.
При работе алгоритма будет сформировано дерево вложенности граней, введенное в разделе 2. Оно образуется гранями, когда каждая имеет список номеров граней, находящихся внутри данной. В процессе работы алгоритма построения дерева вложенности на ребра множества Я будут наноситься пометки (признак того, что данное ребро просмотрено).
Алгоритм построения триангулированного представления ПГМ.
Шаг 1. Построение триангуляции Делоне с ограничениями. На множестве точек плоскости У построим триангуляцию Делоне Т с ограничениями, в качестве которых выступают ребра Я.
Шаг 2. Разметка треугольников триангуляции по принадлежности к граням. Сделаем это следующим образом. Просматриваем последовательно все ребра множества Я, выбираем номера левой и правой граней каждого ребра и записываем эти номера в атрибут - «номер грани-владельца» правому и левому треугольнику ребра соответственно.
Шаг 3. Построение «дерева вложенности» граней, введенного в разделе 2.
3.1. Просматриваем в цикле список граней ПГМ. Для каждой грани выполняем шаг 3.2.
3.2. Выбираем еще не помеченное ребро из списка ребер текущей грани. Данное ребро, если такое существует, необходимо принадлежит либо внешнему контуру текущей грани, либо одному из внутренних. Если такого ребра не существует, то выходим из цикла. Обходим последовательно все ребра данной грани так, чтобы треугольники, образующие грань, всегда оставались справа по отношению к направлению обхода. При обхода контура подсчитываем сумму углов поворотов, сделанных в вершинах ПГМ. В результате получаем обход внутреннего или внешнего контура, как показано на рис. 7. В процессе обхода помечаем все ребра как просмотренные.
Если полученная сумма углов положительна, то контур - внутренний, и для него выполняем шаг 3.3.
3.3. Повторно обходим контур и заносим в список внутренних граней номера всех граней, находя-
дящихся слева от ребер контура. Номера граней, находящихся слева от контура, определяются из атрибута - «номера грани» - треугольников, смежных слева ребрам контура.
Шаг 4. Дерево вложенности построено. Каждая грань имеет список номеров граней, содержащихся строго внутри нее.
Конец алгоритма.
Сделаем несколько замечаний к алгоритму.
Для построения триангуляции Делоне с ограничениями следует использовать эффективные алгоритмы ее построения, использующие кэширование, предложенные в [5]. В [6] представлена модификация данных алгоритмов, эффективно реализующая построение триангуляции с использованием целочисленной арифметики. Трудоемкость этих алгоритмов в среднем составляет О(п), где п - число точек множества V.
Построенная на шаге 1 триангуляция такова, что каждый из треугольников полностью находится (за исключением, может быть, границы), внутри какой-либо грани III М. Поэтому следует приписать каждому треугольнику атрибут - номер грани, содержащей его.
После выполнения алгоритма не требуется хранить в атрибутах граней списки ребер ПГМ, их образующих, так как многоугольник, образуемый любой гранью, может быть получен объединением треугольников триангуляции, имеющих одинаковое значение атрибута - номера грани.
Отметим, что наиболее трудоемкий этап этого алгоритма - первый шаг, на котором выполняется триангуляция. Трудоемкость его составляет О(п) в среднем, где п - число вершин ПГМ. Трудоемкость шагов 2 и 3 составляет О(т) в худшем, где т - число ребер ПГМ, что имеет тот же порядок, что и О(п). Данные оценки трудоемкости получены на основе [5].
Полученное триангулированное представление ПГМ имеет ключевое значение для реализации эффективной объектной векторизации, в процессе которой выполняются массовые операции поиска объектов ПГМ (вершин, ребер и граней) по следующим критериям: поиск объекта, ближайшего к заданной точке плоскости, поиск объекта, попавшего в заданную на плоскости область, поиск ближайшего к заданному объекта того же типа. Приведем основные приемы реализации эффективного поиска объектов ПГМ.
Поиск вершины ПГМ, ближайшей к указанной точке. По кэш-таблице треугольников, построенной при триангулировании, определяется треуго-льник, находящийся на удалении от заданной точки не большем, чем размер ячейки кэш-таблицы. Затем по ребрам треугольника за константное в среднем время на-158
ходится треугольник, содержащий заданную точку, и определяется ближайшая к ней вершина ПГМ.
Поиск ребра ПГМ, ближайшего к указанной точке, выполняется аналогично.
Поиск грани ПГМ, содержащей указанную точку. Аналогично поиску вершины ПГМ по кэш-таблице находится треугольник, содержащий данную точку. Результат определяется по значению атрибута -номера грани - «владельца» данного треугольника.
Поиск вершины ПГМ, ближайшей к заданной вершине, находящейся в заданном направлении. Выбираем все ребра, выходящие из заданной вершины. Выбираем из них ребро, имеющее наименьшее отклонение от заданного направления. Вершина, смежная данной по выбранному ребру, является искомой вершиной.
Объектная векторизация
Как видно из вышеизложенного, построение ПГМ цветного растра выполняется автоматически. Однако построение графических объектов, значимых для пользователя, невозможно без его непосредственного участия. Применение ПГМ позволяет частично автоматизировать этот процесс. Объектной векторизацией будем называть процесс построения векторных объектов в полуавтоматическом режиме, когда пользователь указывает на растре одну-две точки, а алгоритм векторизации восстанавливает весь объект, используя ПГМ для анализа.
Рассмотрим некоторые примеры алгоритмов полуавтоматической векторизации.
Автоматическое построение точечного объекта, имеющего изображение на растре в виде небольшой «кляксы», по указанной пользователем точке. Более точно задача может быть сформулирована так. Пусть на растре имеется изображение точечного объекта. Пользователь указывает точку на плоскости, находящуюся внутри этого объекта или недалеко от него. Требуется найти точку на плоскости, которая находится в середине данного объекта.
С применением ПГМ решение данной задачи становится очевидным и выглядит так. Находим треугольник триангуляции и грань ПГМ, в которые попала указанная точка. Определяем, является ли эта грань выпуклой и имеющей небольшой размер (проверка размера может выполняться для треугольников грани, последовательно просматриваемых алгоритмом). Если данное условие не выполняется, то переходим к рассмотрению ближайшей соседней грани.
Иначе (условие на выпуклость и ограничение размера выполняется) - находится центр грани как точка, координаты которой являются средним арифметическим от соответствующих координат точек грани. Данный центр будет результатом решения задачи.
Автоматическое построение линейного объекта по ПГМ растра и указываемым пользователем одной или нескольким точкам. Поставим задачу следующим образом. Пусть на растре имеется изображение линейного объекта одного цвета. Пользователь указывает одну-две точки на этом объекте. Необходимо построить ломаную или набор ломаных, аппроксимирующих данный линейный объект по его
средней линии. Пример аппроксимирующих ломаных приведен на рис. 8.
Рис. 8. Ломаные, аппроксимирующие линейный объект
Для решения этой задачи можно предложить такой способ.
Так как имеется ПГМ растра, то легко можно установить грань, в которую попадает указанная пользователем точка (или выбрать из нескольких граней, если пользователь указывает несколько точек). Эта грань является векторным объектом линейного объекта на растре, однако грань является площадным объектом, что вызывает необходимость построения «скелета» данной грани. Полученный «скелет» и будет являться результатом данного алгоритма объектной векторизации.
Рассмотрим предлагаемый алгоритм построения «скелета» протяженной грани ПГМ. Введем несколько определений.
Определение. Назовем протяженной гранью ПГМ - грань Е ПГМ, из каждой точки которой можно провести по крайней мере один отрезок до границы Е, состоящий только из внутренних точек Е, длина которого меньше некоторого фиксированного 5, и, кроме того, существуют по крайней мере две точки, принадлежащие Е, такие, что предел минимума расстояния между ними, измеренного по кривой, проходящей только по внутренним точкам Е, намного больше 5.
Определение. Назовем каркасом грани Е ПГМ множество точек плоскости, расстояние от каждой из которых до по крайней мере двух различных граничных точек Е одинаково.
Определение. Назовем «скелетом» грани ПГМ такую ломаную линию (набор ломаных), что каждая из ее вершин находится на одинаковых расстояниях от двух граничных точек грани.
Определение каркаса, предложенное в [4], является конструктивным, но трудоемкость его построения слишком высока. Поэтому введено определение скелета, который будет достаточно точно имитировать каркас, обладая в то же время приемлемой трудоемкостью построения.
Алгоритм построения скелета протяженной грани ПГМ.
Обозначим точку, указанную пользователем, символом х. В процессе работы алгоритма некоторые ребра триангуляции помечаются как просмотренные. После работы алгоритма все пометки на ребрах удаляются.
Шаг 1. Определяем треугольник триангуляции, в который попала точка х. Назовем его t.
Шаг 2. Запускаем процедуру формирования ломаных с параметром - треугольником t (шаг 3).
Шаг 3. Формирование ломаных, начиная от заданного треугольника ^.
3.1. Находим середины непомеченных «невидимых» ребер (ребер, принадлежащих множеству триангуляции) данного треугольника. Если таких ребер нет, то выходим из рекурсии. Добавляем полученный отрезок между серединами ребер к лома-ной-результату.
3.2. Для каждого из «невидимых» ребер находим треугольник, смежный с данным, имеющий с данным общее ребро. Рекурсивно выполняем для него шаг 3.2.
Шаг 4. Генерализация полученного объекта. Полученный на шаге 3 объект имеет вид планарного графа, который может иметь значительное количество несущественных для пользователя деталей, представленных на рис. 9.
ответвления
Рис. 9. Несущественные для пользователя детали объекта
Для избавления от них применяется данный шаг.
4.1. Формирование списка конечных ребер дерева. В список Rf помещаются все ребра, имеющие одну концевую вершину (вершину, инцидентную только одному ребру) и другую вершину, находящуюся на расстоянии не более gamma от ближайшей (по ребрам ломаной) узловой вершины (вершины, имеющей более чем одно инцидентное ребро). Если список Rf пуст, то выходим из цикла, переходя на шаг 4.3.
4.2. Просматриваем список Rf и удаляем из него все ребра, имеющие длину не более фиксированного 5. Возвращаемся на шаг 4.1.
4.3. Полученная на предыдущих шагах алгоритма ломаная будет избавлена от мелких ответвлений, однако будет содержать слишком много промежуточных точек. Для уменьшения их количества применяем генерализацию полученных ломаных, как описано на шаге 4 алгоритма построения ПГМ растра.
Конец алгоритма.
Можно показать, алгоритм имеет линейную трудоемкость относительно числа «невидимых» и «видимых» ребер триангуляции, попавших внутрь данной грани, что достаточно эффективно для данной задачи.
Полуавтоматическое построение площадного объекта по ПГМ растра и указываемым пользователем одной или нескольким точкам. Данная задача имеет следующую общую постановку. Пусть на растре имеется одно или несколько фрагментов изображения одного, значимого для пользователя площадного объекта одного цвета. Пользователь указывает одну или более точек так, чтобы в каждый фрагмент объекта попала хотя бы одна точка. Необходимо построить многоугольник, аппроксимирующий заданный объект по его контуру.
Заметим, что потребность создания одного объекта по нескольким фрагментам на растре возникает в случаях, когда поверх площадного объекта на исходном изображении изображены линейные объек-
ты других типов, либо на площадном объекте имеются надписи, значки и т. п. атрибутивная информация. Кроме того, если площадной объект на исходном изображении ограничен линейным, то возникает задача точного определения границы объекта: в зависимости от решения пользователя границей площадного объекта может считаться граничная линия между линейным и площадным объектами либо осевая линия линейного объекта. Для решения данной задачи с использованием построенной ПГМ может использоваться следующий подход.
Определяются грани ПГМ, в которые попали точки, указанные пользователем. Если таких граней несколько, то последовательно выполняется объединение граней в одну, как описано далее.
Выбираем две из еще не объединенных граней. Находим две граничные вершины ПГМ (одна - на одной грани, вторая - на другой), расстояние между которыми минимально. Находим треугольник (или два треугольника, смежных друг другу), находящийся между найденными вершинами. Помещаем этот треугольник во множество включаемых в объект треугольников, которое обозначим символом I.
Формируем множество включаемых в объект треугольников как множество треугольников, каждый из которых имеет общее ребро с одной из выбранных граней, общую вершину с другой гранью и общее ребро с уже включенными в I треугольниками. Объединение треугольников из I образует многоугольник, имеющий общие части границы с выбранными гранями. Поэтому две грани и I можно логически объединить в одну, получая многоугольник. Этот процесс продолжается итеративно, пока в результате не останется одна логическая грань, которую обозначим символом Р.
Если пользователю не требуется создание границ площадных объектов, проходящих по серединам смежных линейных объектов, то на этом процедура построения площадного объекта заканчивается.
Иначе производится построение точных границ полученного площадного объекта Р, выполняемое следующим образом.
Строим набор треугольников, смежных друг с другом, принадлежащих одной грани ПГМ и имеющих с границей полученного площадного объекта общее ребро или вершину. Полученный связный набор треугольников обозначим символом Для полученного набора треугольников который является многоугольником, строим «скелет» алгоритмом построения скелета протяженной ПГМ (см. выше), который обозначим •£(<%). Если толщина полученного объекта (которая вычисляется как удвоенное расстояние от скелета до граничных линий) меньше заданного порога, то считаем этот набор частью некоторого линейного объекта и заменяем границу площадного объекта Р, проходящую между Р и на Ц«%). Эту процедуру применяем последовательно для всех граней, имеющих с объектом Р общую границу. В результате граница объекта Р будет скорректирована во всех участках, в которых объект Р граничит с линейными объектами.
Таким образом, построение площадных объектов целесообразно выполнять в полуавтоматическом -интерактивном режиме, так как конечный результат зависит от решаемой пользователем задачи.
Заключение
Предлагаемая авторами полигональная графовая модель цветного растра является более общей по сравнению с предложенными ранее в работах [7], [2] графовыми моделями бинарных растров, так как позволяет достаточно полно и с необходимой степенью точности моделировать растры, содержащие произвольное количество цветов. Вместе с тем данная модель получает более точные результаты, чем модели, использующие скелетизацию и построение моделей скелетных линий (см., например, [7]). Кроме того, данный алгоритм обладает меньшей трудоемкостью построения модели растра и ориентирован на интерактивную обработку, что повышает эффективность всего процесса построения цифровых моделей растровых изображений.
ЛИТЕРАТУРА
1 . Костюк Ю.Л., Новиков Ю.Л. Графовые модели растровых изображений в задаче векторизации // Материалы Международной конференции «Дискретный анализ и исследование операций» (Новосибирск, 26 июня - 1 июля 2000). Новосибирск: Изд-во Ин-та математики, 2000. С. 212.
2 . Обработка и отображение информации в растровых графических системах. Минск: ИТК АН БССР, 1989. 180 с.
3 . Новиков Ю.Л. Полигонально-линейные графовые модели растровых изображений // Геоинформатика-2000: Труды Международной научно-практической конференции / Под ред. А.И. Рюмкина, Ю.Л. Костюка, А.В. Скворцова. Томск: Изд-во Том. ун-та, 2000. С. 50-55.
4 . Дуда Р., Харт П. Распознавание образов и анализ сцен: Пер. с англ. М.: Мир, 1976. 511 с.
5 . Скворцов А.В., Костюк Ю.Л. Применение триангуляции для решения задач вычислительной геометрии // Геоинформатика. Теория и практика. Вып. 1. Томск: Изд-во Том. ун-та, 1998. С. 22-47.
6 . Скворцов А.В. Особенности реализации алгоритмов построения триангуляции Делоне с ограничениями // Наст. журн.
7 . Розенфельд А. Распознавание и обработка изображений с помощью вычислительных машин: Пер. с англ. М.: Мир, 1972. 230 с.
Статья представлена кафедрой теоретических основ информатики факультета информатики Томского государственного университета, поступила в научную редакцию номера 3 декабря 2001 г.