Неделя 5 - Геометрические преобразования и перспектива
1. Аффинные преобразования
1.1. Основные понятия
Аффинные преобразования сохраняют параллельность линий:
Поворот
Масштабирование
Сдвиг (трансляция)
Отражение
1.2. Матрица преобразования
Общий вид аффинного преобразования:
Copy
[ a11 a12 b1 ]
[ a21 a22 b2 ]
1.3. Реализация в OpenCV
python
Copy
import cv2
import numpy as np
img = cv2.imread('image.jpg')
rows, cols = img.shape[:2]
# Матрица поворота на 45 градусов
M_rotate = cv2.getRotationMatrix2D((cols/2, rows/2), 45, 1.0)
# Матрица сдвига на 100px по x и 50px по y
M_translate = np.float32([[1, 0, 100], [0, 1, 50]])
# Применение преобразований
rotated = cv2.warpAffine(img, M_rotate, (cols, rows))
translated = cv2.warpAffine(img, M_translate, (cols, rows))
2. Проективные преобразования (гомография)
2.1. Основные понятия
Гомография - перспективное преобразование, сохраняющее прямые линии, но не параллельность.
2.2. Матрица гомографии
3x3 матрица преобразования:
Copy
[ h11 h12 h13 ]
[ h21 h22 h23 ]
[ h31 h32 h33 ]
2.3. Реализация перспективного преобразования
python
Copy
# Исходные точки (углы книги)
src_points = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]])
# Целевые точки (прямоугольник)
dst_points = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]])
# Вычисление матрицы гомографии
H, _ = cv2.findHomography(src_points, dst_points)
# Применение преобразования
warped = cv2.warpPerspective(img, H, (300, 300))
3. Детекция углов и особенностей
3.1. Детектор углов Харриса
python
Copy
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)
# Детекция углов
dst = cv2.cornerHarris(gray, 2, 3, 0.04)
# Разметка углов
img[dst > 0.01*dst.max()] = [0, 0, 255]
3.2. Метод хороших особенностей (Shi-Tomasi)
python
Copy
corners = cv2.goodFeaturesToTrack(gray, 25, 0.01, 10)
corners = np.int0(corners)
for corner in corners:
x, y = corner.ravel()
cv2.circle(img, (x, y), 3, (0, 255, 0), -1)
4. Сопоставление особенностей
4.1. ORB детектор
python
Copy
# Инициализация ORB
orb = cv2.ORB_create()
# Нахождение ключевых точек и дескрипторов
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)
4.2. Сопоставление особенностей
python
Copy
# Создание BFMatcher
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
# Сопоставление дескрипторов
matches = bf.match(des1, des2)
# Сортировка по расстоянию
matches = sorted(matches, key=lambda x: x.distance)
# Визуализация первых 25 совпадений
result = cv2.drawMatches(img1, kp1, img2, kp2, matches[:25], None, flags=2)
5. Практическое задание
1. Примените аффинные преобразования к изображению:
o Поворот на 30 градусов
o Масштабирование в 1.5 раза
o Сдвиг на (50, 100) пикселей
2. Выполните перспективную коррекцию для изображения документа
3. Обнаружьте углы на шахматной доске с помощью детектора Харриса
4. Сопоставьте особенности на двух изображениях одной сцены
6. Итоги
Аффинные преобразования сохраняют параллельность линий
Гомография позволяет исправлять перспективные искажения
Детекторы углов помогают находить характерные точки
Сопоставление особенностей используется для анализа сцен
Следующая тема: Сегментация изображений и анализ контуров