Архив рубрики ~Лента новостей~

Обнаружение признаков, часть 3: Обнаружение углов по методу Харриса

Обнаружение признаков, часть 3: Обнаружение углов по методу Харриса

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

Делиться

NOVOSTI

Введение

Обнаружение признаков — это область компьютерного зрения, которая фокусируется на использовании инструментов для обнаружения областей интереса на изображениях. Важным аспектом большинства алгоритмов обнаружения признаков является то, что они не используют машинное обучение в качестве базового алгоритма, что делает результаты более интерпретируемыми и в некоторых случаях даже более быстрыми.

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

Как и в случае с краями, при анализе изображений часто исследуется другой тип локальных областей: углы. Углы встречаются реже, чем края, и обычно указывают на изменение направления границы объекта или на конец одного объекта и начало другого. Углы встречаются реже и предоставляют более ценную информацию.

Пример

Представьте, что вы собираете двухмерный пазл. Большинство людей вначале находят деталь, изображение которой совпадает с краем объекта. Почему? Потому что так проще идентифицировать соседние детали, поскольку количество деталей, имеющих схожий край объекта, минимально.

Мы можем пойти еще дальше и сосредоточиться не на краях, а на углах — областях, где объект меняет направление своего ребра. Эти фрагменты встречаются еще реже, чем просто края, и благодаря своей уникальной форме позволяют еще проще искать другие смежные фрагменты.

Например, в приведенной ниже головоломке есть 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

Оцените материал:

Поделиться
Понравилась статья? Расскажите другим
ВКонтакте
Читайте также
Архив рубрики ~Коротко из Telegram~ Нейронку БЕЗ ЦЕНЗУРЫ выпустили в открытый доступ — Gemma 4… Архив рубрики ~Коротко из Telegram~ Нашли комбайн для скачивания видео и музыки практически отовсюду —… Архив рубрики ~Коротко из Telegram~ Инструменты дня 🔍 Кьюи Перепроверяет ChatGPT, Claude и Gemini перед отправкой, потому… Архив рубрики ~Коротко из Telegram~ Kimi K3 нашла уязвимость в Redis за 27 минут Исследователь… Архив рубрики ~Коротко из Telegram~ Alibaba представила мощный движок синтеза речи Qwen-Audio-3.0-TTS Команда Qwen выпустила… Архив рубрики ~Коротко из Telegram~ Lightricks научила ИИ убирать лишних людей и машины с видео… Архив рубрики ~Коротко из Telegram~ Copilot теперь живет в «Проводнике» Windows 11 Microsoft продолжает встраивать… Архив рубрики ~Коротко из Telegram~ GitHub Copilot теперь поддерживает модель Gemini 3.6 Flash GitHub начал… Архив рубрики ~Коротко из Telegram~ Anthropic представила плагин Claude Security для поиска уязвимостей Anthropic выпустила… Архив рубрики ~Коротко из Telegram~ Cursor Router: снижение стоимости запросов к ИИ на 60% Команда… Архив рубрики ~Коротко из Telegram~ Российский разработчик СУБД Postgres Pro может сократить до 30% сотрудников…. Архив рубрики ~Коротко из Telegram~ Veon досрочно выкупил облигации на $886 млн, одновременно разместив новый… Архив рубрики ~Коротко из Telegram~ 💢 Иван Паломарес Каррaскоса (Machine Learning Mastery) разбирает пять стратегий… Архив рубрики ~Коротко из Telegram~ ✅ CEO Cloudflare Мэттью Принс на мероприятии Axios в Каннах… Архив рубрики ~Коротко из Telegram~ Нейронку БЕЗ ЦЕНЗУРЫ выпустили в открытый доступ — Gemma 4… Архив рубрики ~Коротко из Telegram~ Нашли комбайн для скачивания видео и музыки практически отовсюду —… Архив рубрики ~Коротко из Telegram~ Инструменты дня 🔍 Кьюи Перепроверяет ChatGPT, Claude и Gemini перед отправкой, потому… Архив рубрики ~Коротко из Telegram~ Kimi K3 нашла уязвимость в Redis за 27 минут Исследователь… Архив рубрики ~Коротко из Telegram~ Alibaba представила мощный движок синтеза речи Qwen-Audio-3.0-TTS Команда Qwen выпустила… Архив рубрики ~Коротко из Telegram~ Lightricks научила ИИ убирать лишних людей и машины с видео… Архив рубрики ~Коротко из Telegram~ Copilot теперь живет в «Проводнике» Windows 11 Microsoft продолжает встраивать… Архив рубрики ~Коротко из Telegram~ GitHub Copilot теперь поддерживает модель Gemini 3.6 Flash GitHub начал… Архив рубрики ~Коротко из Telegram~ Anthropic представила плагин Claude Security для поиска уязвимостей Anthropic выпустила… Архив рубрики ~Коротко из Telegram~ Cursor Router: снижение стоимости запросов к ИИ на 60% Команда… Архив рубрики ~Коротко из Telegram~ Российский разработчик СУБД Postgres Pro может сократить до 30% сотрудников…. Архив рубрики ~Коротко из Telegram~ Veon досрочно выкупил облигации на $886 млн, одновременно разместив новый… Архив рубрики ~Коротко из Telegram~ 💢 Иван Паломарес Каррaскоса (Machine Learning Mastery) разбирает пять стратегий… Архив рубрики ~Коротко из Telegram~ ✅ CEO Cloudflare Мэттью Принс на мероприятии Axios в Каннах…