Автоматическая обрисовка создаёт векторный контур

   Такие фигуры векторной графики, как Многоугольник, и особенно, Ломаная линия ( о которых говорилось вот тут - http://proza.ru/2020/12/08/1718 ), содержат иногда очень много точек. Отрисовывать каждую точку, копируя найденный в интернете силуэт, - долго. А обрисовывать его контур от руки - получается не очень точно. Поэтому задача получения контура путём автоматической обрисовки силуэта является актуальной.
   Расскажу о том, как я сделал автоматическую обрисовку в своей программе.

   Силуэт это область, заполненная совершенно однородным цветом. Фон не обязательно должен быть однородным. В интернете чаще всего можно найти чёрные силуэты на светлом фоне. Вокруг чёрного силуэта обычно имеется кайма, состоящая из пикселей переходных тонов. Но она не в счёт, она тоже считается фоном.
   Если же вас эта кайма интересует, поскольку она содержит некие детали, которые вы хотите включить в свой векторный контур, то поработайте над изображением. Можно сделать изображение более контрастным, а затем, установив порог дискриминации по яркости, сделать его черно белым в совершенно явном виде, и тогда будет ясно, войдут ли желаемые детали в контур. Эти детали можно и подрисовать. Можно, и даже нужно, соединить внутренние белые островки со внешним фоном, прочертив тонкие белые каналы, иначе будущий контур эти островки минует.
   Я именно так и поступил, найдя изображение дамы с зонтиком в интернете. Полученный контур из 1177 точек можно видеть на иллюстрации слева. Расскажу об алгоритме, по которому этот контур делается.

   Кликнем внутри силуэта исходную точку, и компьютер запомнит её координаты. Затем выставляем цвет контура (пусть этот цвет будет красным) и фоновый цвет для его будущей заливки.
   Ставим на кнопке, регулирующей размер точки рисования, цифру – от 1 до 9-ти. Единица, это самый мелкий шаг – точки на контуре будут следовать с интервалом в 2 пикселя. Девять – шаг с интервалом 18.
   Теперь нажимаем клавишу «ё» или «Ё», и тогда начальная точка контура будет искаться слева или справа от исходной точки.

   Итак, компьютер ищет начальную точку на краю чёрного силуэта и находит её. А найдя, окрашивает найденный пиксель в красный цвет, и запоминает его координаты – X1,Y1. Кроме того он определяется с началом обзора окрестностей – полагает индекс обзора J = 3, если пришёл к начальной точке, двигаясь справа налево, или J = 7 в противоположном случае.
   В общем, вы поняли – начало обзора начинается с той точки, на которой компьютер был перед этим. Обзор делается против часовой стрелки в соответствии с очередным номером J (то есть J = J + 1: If J > 8 Then J = 1),  и в соответствии с диаграммой -
 
6 5 4      Если, осматривая окрестности точки 0, компьютер встретит точку
7 0 3    фона, тогда он переходит в режим ожидания чёрной или красной
8 1 2    точки. И этот момент неминуемо наступает.

   И тогда компьютер окрашивает в красный цвет найденный пиксель, и перебазируется на него (Xo = X: Yo = Y). А индекс J ставит на тот пиксель, на котором он только что был (J = J + 4: If J > 8 Then J = J - 8). Изредка, проделав это, он записывает координаты найденного пикселя в список точек, составляющих будущий контур.
   Процесс заканчивается, как только компьютер, завершив обводку, придёт в начальную точку.

   Вы видите, как это всё просто – мы фактически идём по пикселям вдоль силуэта, держась за его границу левой рукой. Если фон вокруг силуэта однороден, то точно таким же способом силуэт можно оконтурить извне.

   Разглядывая исходный силуэт и полученную векторную фигуру, вы можете найти некоторые различия. Во-первых, фигура залита не полностью – не залит верх зонтика и нижний край платья. Так случилось оттого, что поле заливки ограничено размером 400х400 пикселей. Что не принципиально, и я, пожалуй, сделаю размер этого поля немного побольше.
   Не залит один помпон на ручке зонта – входа для проникновения заливки между двумя частями контура не осталось. Контур в этом месте можно скорректировать, чтобы заливка в помпон проходила. Кстати, этот помпон находится где-то в конце контура, и неужели нам придётся жать на клавишу > тысячу раз, чтобы дойти от начала контура до нужной точки корректировки?
   Нет – для быстрых передвижений по контуру предусмотрена клавиша /, она находится правее, и с её помощью мы передвигаемся через 10 точек сразу.
   Некоторые детали на вуали и на волосах воспроизводятся не совсем так. Связано это с тем, что даже при самом мелком шаге контур записан у нас через один пиксель на следующий, то есть, реальный шаг контура загрублён. Но тут уж ничего не поделаешь, экономить на количестве точек нужно, тем более, что различия получаются не столь уж и большими. Подумаешь, волосы растрепались чуть по-другому, такое бывает. ))   
 
_________
9.12.2020


Рецензии