Углы и ключевые точки: идея SIFT и ORB
Чтобы сопоставить два снимка одного объекта, нужны точки, которые легко узнать с любой стороны — ключевые точки.
Ключевая точка (keypoint) — заметное, устойчивое место на изображении (обычно угол), которое можно надёжно найти снова на другом снимке той же сцены.
Почему углы, а не края
Представьте, что вы пытаетесь сопоставить две фотографии здания. Гладкая стена — бесполезный ориентир: любой её кусок похож на соседний. Край (грань крыши) уже лучше, но вдоль него тоже не понять, где именно вы находитесь — можно сдвинуться вдоль линии и не заметить. А вот угол — место, где яркость резко меняется сразу в двух направлениях — уникален: сдвиньтесь в любую сторону, и картина вокруг угла изменится. Поэтому углы — лучшие «якоря».
| Тип точки | Изменение яркости | Как ориентир |
| Ровная область | нет ни в одном направлении | бесполезна |
| Край | есть только поперёк линии | неоднозначен вдоль линии |
| Угол | есть в двух направлениях | отличный, уникальный |
Дескриптор: «отпечаток» точки
Найти угол мало — нужно его описать, чтобы узнать тот же угол на другом снимке. Для этого вокруг точки строят дескриптор: компактный вектор чисел, описывающий, как распределены градиенты яркости в окрестности. Хороший дескриптор обладает инвариантностью: один и тот же угол даёт похожий дескриптор, даже если объект:
- сдвинут (инвариантность к положению);
- повёрнут (к вращению);
- снят ближе или дальше (к масштабу);
- при другом освещении (к яркости).
SIFT и ORB
SIFT (Scale-Invariant Feature Transform) — классический мощный алгоритм: находит ключевые точки на разных масштабах и строит дескрипторы, устойчивые к повороту и масштабу. Очень надёжен, но вычислительно тяжёл. ORB — быстрая и свободная альтернатива: даёт компактные бинарные дескрипторы, работает в реальном времени, поэтому популярен в мобильных приложениях и робототехнике.
Имея дескрипторы на двух снимках, их сопоставляют (matching): для каждой точки первого ищут самую похожую на втором. Так работают панорамная склейка фото, поиск объекта на сцене, дополненная реальность, визуальная одометрия (SLAM) в роботах и дронах.
Грубая аналогия сопоставления
Сопоставление — это поиск самого близкого дескриптора. Идею можно показать на маленьких векторах: найдём для точки запроса ближайшую по расстоянию.
def dist(a, b):
return sum((x - y) ** 2 for x, y in zip(a, b)) ** 0.5
query = [2, 5, 1] # дескриптор точки на снимке A
candidates = {
"угол окна": [2, 6, 1],
"угол двери": [9, 1, 8],
"край крыши": [3, 5, 0],
}
best = min(candidates, key=lambda k: dist(query, candidates[k]))
for name, vec in candidates.items():
print(f"{name:12}: расстояние {dist(query, vec):.2f}")
print("Совпадение:", best)
Вывод:
угол окна : расстояние 1.00 угол двери : расстояние 10.68 край крыши : расстояние 1.41 Совпадение: угол окна
Дескриптор запроса ближе всего к «углу окна» — значит, на втором снимке это та же точка. Настоящие SIFT/ORB делают то же, только дескрипторы там длиннее и устойчивее.
Итог
- Углы — лучшие ориентиры: яркость меняется сразу в двух направлениях.
- Дескриптор — вектор-«отпечаток» окрестности точки.
- Хороший дескриптор инвариантен к сдвигу, повороту, масштабу, яркости.
- SIFT — точный, но тяжёлый; ORB — быстрый и бесплатный. Сопоставление = поиск ближайшего дескриптора.