Для каждого пикселя изображения находим градиент и в отдельную матрицу заносим значение, соответствующее углу градиента, квантованному на восемь частей: 0 - [0°,44°] ; 1 - [45°,89°] … 7 - [315°, 359°] (для хранения номера сектора достаточно трёх бит). Затем ко всем углам прибавляем 22,5° и в другую такую же матрицу заносим тоже числа от 0 до 7, но используя новые значения углов.
В каждой из двух матриц с помощью волнового алгоритма происходит поиск групп соседних пикселей, имеющих одинаковое значение. Эти пиксели называются связными. Затем соответствующие группы в двух матрицах сравниваются, и в какой группе связных пикселей больше, ту и считаем отрезком. Если один пиксель входит в два отрезка, то считаем, что он принадлежит тому, в котором больше пикселей.
Сегментация — разбиение изображения на монотонные области. Внутри каждого сегмента (до обработки) пиксели имеют примерно одинаковый цвет. На границах сегментов происходит резкое изменение цвета.
Классы методов сегментации:
● Методы, использующие кластеризацию
○ Определяется метрика P(x,y), показывающая схожесть цветов x и y.
○ Множество всех цветов, имеющихся на изображении, разбивается на несколько непересекающихся подмножеств — кластеров — так, чтобы “расстояние” между любыми двумя элементами одного кластера было гораздо меньше, чем расстояние между элементами разных кластеров.
○ Геометрически точки одного кластера могут находиться в разных частях изображения
● Методы наращивания областей
○ Создаётся новый кластер, содержащий одну базовую точку
○ В кластер добавляются все соседние к базовой точке, схожие с ней по цвету
○ Процедура повторяется рекурсивно с добавленными точками
○ Модификации:
■ Сравнивать цвета с соседними точками
■ Сравнивать цвета с базовой точкой
■ Сравнивать со средним значением цвета в накопленном кластере (важно, с какого пикселя начинается поиск)
До сегментации
После сегментации
● Метод водораздела
Градиент яркости/цвета ∇f показывает степень граничности пикселя, ∇∇f — направление, в котором быстрее всего возрастает степень граничности. Берём некоторый пиксель, вычисляем ∇∇f в нём и двигаемся в противоположном направлении до пикселя, в котором будет минимальное значение ∇∇f. Если ∇∇f =0, то (мы достигли локального экстремума градиента) пиксель образует отдельный сегмент, иначе он принадлежит сегменту, расположенному в направлении, обратном ∇∇f .
Способы хранения сегментов:
1 Маркированное изображение. Для каждого пикселя указывается число — номер сегмента, к которому он принадлежит. Используется очень много памяти, зато позволяет определить принадлежность точки сегменту за О(1).
2 Квадрантные деревья. Если квадрант полностью входит в некоторый сегмент, то записывается номер этого сегмента, в противном случае квадрант делится на четыре, и процедура рекурсивно повторяется, пока не будет достигнута необходимая точность. Результат хранится в виде дерева. На примере два сегмента 0 и 1.
3 Кодирование границ. У сегмента граница замкнутая, ⇒ можно ее обойти по (против) часовой стрелке. Хранятся координаты начальной точки и закодированный путь обхода (←↑→↓). Используется мало памяти, но неудобно работать.