Как найти наиболее информативные точки на изображениях
Делиться

Введение
Обнаружение признаков — это область компьютерного зрения, которая фокусируется на использовании инструментов для обнаружения областей интереса на изображениях. Важным аспектом большинства алгоритмов обнаружения признаков является то, что они не используют машинное обучение в качестве базового алгоритма, что делает результаты более интерпретируемыми и в некоторых случаях даже более быстрыми.
В двух предыдущих статьях этой серии мы рассмотрели наиболее популярные операторы для обнаружения границ изображений: операторы Собеля, Шарра, Лапласа , а также оператор Гаусса, используемый для сглаживания изображений. В той или иной форме эти операторы использовали производные изображения и градиенты, представленные сверточными ядрами.
Как и в случае с краями, при анализе изображений часто исследуется другой тип локальных областей: углы. Углы встречаются реже, чем края, и обычно указывают на изменение направления границы объекта или на конец одного объекта и начало другого. Углы встречаются реже и предоставляют более ценную информацию.

Пример
Представьте, что вы собираете двухмерный пазл. Большинство людей вначале находят деталь, изображение которой совпадает с краем объекта. Почему? Потому что так проще идентифицировать соседние детали, поскольку количество деталей, имеющих схожий край объекта, минимально.
Мы можем пойти еще дальше и сосредоточиться не на краях, а на углах — областях, где объект меняет направление своего ребра. Эти фрагменты встречаются еще реже, чем просто края, и благодаря своей уникальной форме позволяют еще проще искать другие смежные фрагменты.
Например, в приведенной ниже головоломке есть 6 ребер (B2, B3, B4, D2, D3 и D4) и только 1 угол (C5). Выбрав угол в начале, становится проще определить его положение, поскольку он встречается реже, чем ребра.

Цель этой статьи — понять, как можно обнаруживать углы. Для этого мы рассмотрим детали алгоритма обнаружения углов Харриса — одного из самых простых и популярных методов, разработанного в 1988 году.
Идея
Рассмотрим три типа областей: плоские , краевые и угловые . Структуру этих областей мы уже показали выше. Наша цель — понять распределение градиентов в этих трех случаях.
В ходе анализа мы также построим эллипс, который будет содержать большинство нанесенных точек. Как мы увидим, его форма даст четкое представление о типе региона, с которым мы имеем дело.
Плоский регион
Простейший случай — это плоская область. Обычно вся область изображения имеет почти одинаковые значения интенсивности, что делает значения градиента по осям X и Y незначительными и центрированными вокруг 0.
Взяв точки градиента (Gₓ, Gᵧ) из приведенного выше примера плоского изображения, мы можем построить график их распределения, который выглядит следующим образом:

Теперь мы можем построить эллипс вокруг нанесенных точек с центром в точке (0, 0). Затем мы можем определить его две главные оси:
- Главная ось, вдоль которой эллипс максимально растянут.
- Малая ось, вдоль которой эллипс достигает своей минимальной протяженности.
В случае плоской области может быть сложно визуально различить большую и малую оси, поскольку эллипс, как и в нашем случае, имеет округлую форму.
Тем не менее, для каждой из двух главных осей мы можем вычислить радиусы эллипса λ₁ и λ₂. Как показано на рисунке выше, они почти равны и имеют малые относительные значения.
Краевая область
В краевой области интенсивность изменяется только в пределах этой зоны. За пределами края интенсивность остается практически неизменной. Учитывая это, большинство точек градиента по-прежнему центрированы вокруг (0, 0).
Однако на небольшом участке вокруг краевой зоны значения градиента могут резко меняться в обоих направлениях. На приведенном выше примере край расположен по диагонали, и мы видим изменения в обоих направлениях. Таким образом, распределение градиента смещено в диагональном направлении, как показано ниже:

В краевых областях отображаемый эллипс обычно смещен в одну сторону и имеет очень разные радиусы λ₁ и λ₂.
Угловой регион
В углах большинство значений интенсивности за пределами углов остаются неизменными; таким образом, распределение для большинства точек по-прежнему находится вблизи центра (0, 0).
Если мы рассмотрим угловую структуру, то её можно приблизительно представить как пересечение двух рёбер, имеющих два разных направления. Что касается рёбер, то, как мы уже обсуждали в предыдущем разделе, распределение идёт в одном направлении либо по оси X, либо по оси Y, либо в обоих направлениях.
Наличие двух ребер в углу приводит к образованию двух различных точечных спектров, растущих в двух разных направлениях от центра. Пример показан ниже.

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

Формула
Для классификации региона по одной из трех зон обычно используется приведенная ниже формула для оценки коэффициента R:
R = λ₁ ⋅ λ₂ – k ⋅ (λ₁ + λ₂)², где 0,04 ≤ k ≤ 0,06
На основе значения R мы можем классифицировать область изображения:
- R < 0 – краевая область
- R ~ 0 – плоская область
- R > 0 – угловая область
OpenCV
Обнаружение углов по Харрису легко реализовать в OpenCV с помощью функции cv2.CornerHarris. Давайте посмотрим на примере ниже, как это можно сделать.
Вот входное изображение, с которым мы будем работать:

Для начала импортируем необходимые библиотеки.
import numpy as np import cv2 import matplotlib.pyplot as plt
Мы собираемся преобразовать входное изображение в формат оттенков серого, поскольку детектор Харриса работает с интенсивностью пикселей. Также необходимо преобразовать формат изображения в float32, поскольку вычисленные значения, связанные с пикселями, могут выходить за пределы диапазона [0, 255].
path = 'data/input/shapes.png' image = cv2.imread(path) grayscale_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) grayscale_image = np.float32(grayscale_image)
Теперь мы можем применить фильтр Харриса. Функция cv2.cornerHarris принимает четыре параметра:
- grayscale_image – входное изображение в оттенках серого в формате float32.
- blockSize (= 2) – определяет размеры пиксельного блока в окрестности целевого пикселя, рассматриваемого для обнаружения углов.
- ksize (= 3) – размерность фильтра Собеля, используемого для вычисления производных.
- k (= 0,04) – коэффициент в формуле, используемой для вычисления значения R.
R = cv2.cornerHarris(grayscale_image, 2, 3, 0.04) R = cv2.dilate(R, None)
Функция cv2.cornerHarris возвращает матрицу точно таких же размеров, как и исходное изображение в оттенках серого. Ее значения могут выходить далеко за пределы нормального диапазона [0, 255]. Для каждого пикселя эта матрица содержит значение коэффициента R, которое мы рассматривали выше.
Оператор cv2.dilate — это морфологический оператор, который при желании можно использовать сразу после него для более наглядной группировки локальных углов.
Распространенный метод заключается в определении порогового значения, ниже которого пиксели считаются углами. Например, мы можем считать все пиксели изображения углами, значение R которых больше максимального глобального значения R, деленного на 100. В нашем примере мы присваиваем таким пикселям красный цвет (0, 0, 255).
Для визуализации изображения необходимо преобразовать его в формат RGB.
image[R > 0.01 * R.max()] = [0, 0, 255] image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
Наконец, для отображения выходного изображения мы используем библиотеку maplotlib.
plt.figure(figsize=(10, 8)) plt.imshow(image_rgb) plt.title('Обнаружение углов Харриса') plt.axis('off') plt.tight_layout() plt.show()
Вот результат:

Заключение
В данной статье мы рассмотрели надежный метод определения того, является ли область изображения углом. Представленная формула для оценки коэффициента R хорошо работает в подавляющем большинстве случаев.
В реальной жизни часто возникает необходимость запустить классификатор границ для всего изображения. Построение эллипса вокруг точек градиента и оценка коэффициента R каждый раз требует значительных ресурсов, поэтому для ускорения процесса используются более сложные методы оптимизации. Тем не менее, они во многом основаны на той интуиции, которую мы изучали здесь.
Ресурсы
- Угловой детектор Харриса | Википедия
- Обнаружение углов Харриса | OpenCV
Все изображения, если не указано иное, предоставлены автором.
Источник: towardsdatascience.com



























