Вступление


В предыдущей статье мы рассмотрели распространение волновых нейронов, а сейчас нужно рассмотреть описатель активных(красных) нейронов. В данной статье будет предложена простой метод описания контура, образованного вокруг черного изображения.


Теория


Напоминаю, что у нас имеется черно-белое изображение. Мы пишем условие активации белых пикселей, тогда и только тогда, когда рядом с белым пикселем находится только один или более черных пикселей. В таком случае мы закрашиваем белый пиксель в красный цвет.
То есть мы получаем сплошной контур.


Задача данной статьи — дать краткое описание набору красных пикселей.


Рассмотрим простое трехцветное изображение


Изображение


Мы начинаем сканировать изображение сверху-вниз справа-налево до тех пор, пока не найдем первый красный пиксель. Как только мы его найдем, закрасим его в зеленый цвет и сохраним этот пиксель в отдельном массиве для анализа.


Изображение


Далее нужно найти ближний от зеленого пикселя красный пиксель. Этих пикселей два. Если взять один из пикселей, то будет обход по часовой стрелке, если взять другой пиксель, то будет обход против часовой стреле. Скажу заранее, что результат не изменится, против часовой стрелки мы пойдем или по часовой стрелке.


Изображение


В данном случае я обхожу красные пиксели по часовой стрелке. Все также, если мы видим рядом с зеленой клеткой красный пиксель, то заменяем его(красный пиксель) на зеленый и вносим в массив координаты красного пикселя, который был заменен на зеленый. Также перемещаем позицию сканирования точек.


Изображение


Теперь важный момент. Мы добрались то того места, когда предыдущее значение зеленого пикселя по у меньше текущего значения зеленого пикселя по y. Поскольку значение текущего пикселя больше предыдущего, то мы добавляем в массив описателя волнового фронта единичку.


Изображение


Продолжаем обходить контур и ставить единички в массив описателя.


Изображение


Поскольку при обходе контура на картинке положение красных пикселей по у не меняется, соответственно, мы не добавляем единички в массив описателя.


Изображение


Здесь значение текущего пикселя по y меньше предыдущего. Следовательно запишем в массив -1.


Изображение


Здесь состояние пикселей по y также не изменилось, следовательно, также ничего не заносим в массив.


Изображение


Мои Поздравления! Мы обошли контур.Если есть аналогичные контуры, мы также их обходим.


Изображение


Теперь можно упростить запись и дублирующиеся элементы удалить. Таким образом, для данного фрагмента черных пикселей описатель волнового фронта будет равен (1,-1)


Работа программы.


Также я хотел бы показать работу программы, которая работает с изображениями, и просчитывает их контуры. Эта программа выбирает бинарное(черно-белое) изображение из исходного изображения, которое состоит из нескольких цветов. Также эта программа создает контуры красного цвета между белыми и красными цветами. Рассмотрим работу программы на следующих примерах.


Изображение


Так выглядит программа при старте


Изображение


Нажмем кнопку открыть файл


Изображение


При загрузке файл отобразиться в двух окнах


Изображение


Нажмем на кнопку «вперед».Мы начинаем сканировать контур изображения сверху вниз и получаем контур. Сначала контур идет сверху вниз, и значения получаются положительными, потом контур идет вниз — и значения отрицательные. Следовательно мы получаем значения 1,-1


Изображение


Будем продолжать нажимать на кнопку «вперед» до тех пор, пока не получим другое значение контура. Сейчас значение контура 1, -1, 1, -1. Почему так. Если присмотреться, то мы увидим углубление на контуре. Сначала контур идет сверху вниз, мы получаем положительные значения, потом идем снизу вверх, получаем отрицательные значения, потом опять идем сверху вниз, получаем положительные значения, и опять, получаем снизу вверх и опять получаем отрицательные значения. Поэтому получаем значения 1, -1, 1, -1
Продолжим нажимать кнопку вперед.


Изображение


Увы, значения контура не изменяется. Однако все верно. Контур высчитывается верно.
Продолжаем нажимать на кнопку «вперед»


Изображение


Изменений не происходит. Все нормально.


Изображение


Мы дошли до конца. Значения контуров также не изменилось. Все правильно.
Нажмем на кнопку сканирование.


Изображение


Программа подумает и выдаст следующий результат.

В данном случае мы получим несколько другой результат. Программа сканирует изображение и записывает отличные друг от друга контуры. Сначала мы получали значение 1, -1 и мы записываем его. Потом мы записываем значение 1, -1, 1, -1 некоторое количество раз. Повторяющиеся элементы мы удаляем. Получаем соответствующий результат. {{1,-1}}{{1,-1,1,-1}}


Следующая статья здесь


Спасибо за чтение статьи