Вступление
В предыдущей статье мы рассмотрели распространение волновых нейронов, а сейчас нужно рассмотреть описатель активных(красных) нейронов. В данной статье будет предложена простой метод описания контура, образованного вокруг черного изображения.
Теория
Напоминаю, что у нас имеется черно-белое изображение. Мы пишем условие активации белых пикселей, тогда и только тогда, когда рядом с белым пикселем находится только один или более черных пикселей. В таком случае мы закрашиваем белый пиксель в красный цвет.
То есть мы получаем сплошной контур.
Задача данной статьи — дать краткое описание набору красных пикселей.
Рассмотрим простое трехцветное изображение
Мы начинаем сканировать изображение сверху-вниз справа-налево до тех пор, пока не найдем первый красный пиксель. Как только мы его найдем, закрасим его в зеленый цвет и сохраним этот пиксель в отдельном массиве для анализа.
Далее нужно найти ближний от зеленого пикселя красный пиксель. Этих пикселей два. Если взять один из пикселей, то будет обход по часовой стрелке, если взять другой пиксель, то будет обход против часовой стреле. Скажу заранее, что результат не изменится, против часовой стрелки мы пойдем или по часовой стрелке.
В данном случае я обхожу красные пиксели по часовой стрелке. Все также, если мы видим рядом с зеленой клеткой красный пиксель, то заменяем его(красный пиксель) на зеленый и вносим в массив координаты красного пикселя, который был заменен на зеленый. Также перемещаем позицию сканирования точек.
Теперь важный момент. Мы добрались то того места, когда предыдущее значение зеленого пикселя по у меньше текущего значения зеленого пикселя по 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}}
Спасибо за чтение статьи
Tiendil
Автор, видели эту серию постов: habr.com/ru/post/308370 (внизу поста список следующих есть)?
По-моему там дальше ушли в проработке такого подхода.
pav91pav Автор
Да, я читал логику сознания Алексея Дмитриевича.Эти статьи изменили мой подход к машинному обучению.Однако нужно понимать, что это не последняя моя статья.