CV — Увеличение данных: аффинное преобразование

алгоритм
  • Пожалуйста, обратите внимание на источник оригинального текста при перепечатке, спасибо:blog.CSDN.net/Pentium cm/Ах…

CV — Увеличение данных: аффинное преобразование

Введение

(1) Концепция аффинного преобразования

  1. Предисловие: При улучшении данных глубокого обучения нам часто требуется выполнять различные операции улучшения над изображением, такие как: перевод, отражение (flip), масштабирование (Scale), вращение (Rotation), обрезка (Shear) и т. д., это на самом делеАффинное преобразование изображений. Подлежит подтверждению: контрастность, дрожание цвета, шум

  2. Принцип аффинного преобразования:

    • Определение в Википедии:Аффинное преобразование(Аффинное преобразование), также известное какАффинное отображение, а это значит, что в геометрии векторное пространство выполняется один разЛинейное преобразованиеи возьми одинСковорода, преобразованное в другое векторное пространство.

      Проще говоря, «аффинное преобразование» это: «линейное преобразование» + «перевод».

    • Пример:

      Предполагая, что есть векторное пространство 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) Матрица аффинного преобразования

  1. Сковорода:

    # x向左平移(负数向左,正数向右) dx 个像素
    # y向下平移(负数向上,正数向下) dy 个像素
    M = [[1, 0, dx],
         [0, 1, dy]]
    

    在这里插入图片描述

  1. Подбросить:

    # 水平翻转
    M = [[-1, 0, w],
         [0, 1, 0]]
    ​
    # 垂直翻转
    M = [[1, 0, 0],
         [0, -1, h]]
    

    在这里插入图片描述

  2. Масштаб:

    # fx,fy:宽高缩放的倍数
    M = [[fx, 0, 0],
         [0, fy, 0]])
    

    在这里插入图片描述

  1. Вращение:

    # 以原点为中心旋转
    # d:要转化为弧度制,d = 角度a * pi / 180
    M = [[cosd, -sind, 0],
         [sind, cosd, 0]]
    

    在这里插入图片描述

  2. Сдвиг:

    # 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

1. warpAffine

  1. def warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None):

    • Объяснение: Функция аффинного преобразования, которая может осуществлять вращение, перемещение и масштабирование; преобразованные параллельные линии остаются параллельными.

    • параметр:

      src: входное изображение. dst: выходное изображение.

2. warpPerspective

  1. 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()
      ​
      
  • Эффект следующий:

    Левое изображение — это исходное изображение, а правое изображение — это изображение после трансляционного аффинного преобразования.

    在这里插入图片描述

\