- Пожалуйста, обратите внимание на источник оригинального текста при перепечатке, спасибо:blog.CSDN.net/Pentium cm/Ах…
CV — Увеличение данных: аффинное преобразование
Введение
(1) Концепция аффинного преобразования
-
Предисловие: При улучшении данных глубокого обучения нам часто требуется выполнять различные операции улучшения над изображением, такие как: перевод, отражение (flip), масштабирование (Scale), вращение (Rotation), обрезка (Shear) и т. д., это на самом делеАффинное преобразование изображений. Подлежит подтверждению: контрастность, дрожание цвета, шум
-
Принцип аффинного преобразования:
-
Определение в Википедии:Аффинное преобразование(Аффинное преобразование), также известное какАффинное отображение, а это значит, что в геометрии векторное пространство выполняется один разЛинейное преобразованиеи возьми одинСковорода, преобразованное в другое векторное пространство.
Проще говоря, «аффинное преобразование» это: «линейное преобразование» + «перевод».
-
Пример:
Предполагая, что есть векторное пространство k: k = (x, y) и векторное пространство j: j = (x', y'), j может быть преобразовано в k аффинным преобразованием.
Действуйте следующим образом:
- Пусть: j = w * k + b, разложение: x' = w00 * x + w01 * y + b0, y' = w10 * x + w11 * y + b1
- Преобразовать в матричное умножение:пройти черезматрица параметров MПреобразование между двумя векторными пространствами может быть реализовано.
-
Резюме: при выполнении аффинного преобразования нам нужна только матрица M для реализации таких преобразований, как перемещение, масштабирование, вращение и отражение.
Аффинное преобразование представляет собой линейное преобразование между двумерными координатами в двумерные координаты, при этом сохраняется «прямолинейность» двумерного рисунка (после линейного преобразования остается прямолинейным) и «параллельность» (двумерный образец относительного позиционного отношения поддерживается между параллельными прямыми по-прежнему параллельными прямыми, а положение инвариантной точки на прямой последовательно). Произвольное аффинное преобразование может быть выражено путем умножения матрицы (линейное преобразование) вместе с формой вектора (перевод).
-
(2) Матрица аффинного преобразования
-
Сковорода:
# x向左平移(负数向左,正数向右) dx 个像素 # y向下平移(负数向上,正数向下) dy 个像素 M = [[1, 0, dx], [0, 1, dy]]
-
Подбросить:
# 水平翻转 M = [[-1, 0, w], [0, 1, 0]] # 垂直翻转 M = [[1, 0, 0], [0, -1, h]]
-
Масштаб:
# fx,fy:宽高缩放的倍数 M = [[fx, 0, 0], [0, fy, 0]])
-
Вращение:
# 以原点为中心旋转 # d:要转化为弧度制,d = 角度a * pi / 180 M = [[cosd, -sind, 0], [sind, cosd, 0]]
-
Сдвиг:
# a,b:要转化为弧度制,角度 * pi / 180 # 仅 x 坐标剪切 M = [[1, tan(a), 0], [0, 1, 0]] # 仅 y 坐标剪切 M = [[1, 0, 0], [tan(b), 1, 0]] # x 与 y坐标同时剪切 M = [[1, tan(a), 0], [tan(b), 1, 0]]
Во-вторых, реализация кода
(1) Описание функции OpenCV
-
Использованная литература:
- Аффинное описание и использование opencv:blog.CSDN.net/Чжу Гуйцинь1/…
- Разница между аффинным преобразованием и перспективным преобразованием:blog.CSDN.net/Leal English sub-flying…
1. warpAffine
-
def warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None):
-
Объяснение: Функция аффинного преобразования, которая может осуществлять вращение, перемещение и масштабирование; преобразованные параллельные линии остаются параллельными.
-
параметр:
src: входное изображение. dst: выходное изображение.
-
2. warpPerspective
-
def warpPerspective(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None):
- Объяснение: функция преобразования перспективы, которая сохраняет прямые линии неискаженными, но параллельные линии больше не могут быть параллельными
- Параметры: связанные параметры аналогичны параметрам функции cv2.warpAffine.Разница в следующем: M — матрица преобразования 3 × 3. Первые две строки матрицы используются для аффинного преобразования, а третья строка — для перспективы. трансформация.
(2) Код реализации
-
Полный код:
-
Полная ссылка на код:Аффинное преобразование — opencv
-
Выберите один из них для иллюстрации: Возьмем в качестве примера перевод в аффинном преобразовании, для других преобразований требуется толькоМатрица для замены аффинного преобразованияПросто:
import cv2 import numpy as np def translation_img(image, pad_color=(114, 114, 114)): """ 仿射变换:平移 步骤:1. 设置平移仿射系数 2. 利用OpenCV中的warpAffine函数 :return: """ # 定义一个图像平移矩阵,矩阵M:仿射变换的平移参数 # x向左平移(负数向左,正数向右) 100 个像素 # y向下平移(负数向上,正数向下) 100 个像素 # M = [[1, 0, dx], # [0, 1, dy]] M = np.array([[1, 0, -100], [0, 1, 100]], dtype=np.float) # 定义平移后图像的大小,保持和原图大小一致 dsize = image.shape[:2][::-1] # 采用灰色来填充边界 image = cv2.warpAffine(image, M, dsize, borderValue=pad_color) return image if __name__ == '__main__': image = cv2.imread('000007.jpg') cv2.imshow('org_img', image) image_dst = translation_img(image) cv2.imshow('image_dst', image_dst) cv2.waitKey(0) cv2.destroyAllWindows()
-
-
Эффект следующий:
Левое изображение — это исходное изображение, а правое изображение — это изображение после трансляционного аффинного преобразования.
\