仿射變換


參考資料: 馬同學:如何通俗的解釋仿射變換

1. 仿射變換的作用:

通過仿射變換對圖片進行旋轉、平移、縮放等操作以達到數據增強的效果

2. 仿射變換的實質

線性變換 + 平移

------------------------------------------------------------------------------------------------------

2.1 線性變換

線性變換從幾何直觀上來看有三個要點:

  • 變換前是直線,變換后依然是直線
  • 直線的比例保持不變
  • 變換前是原點的,變換后依然是原點

比如說旋轉推移

可以看到,線性變換是通過矩陣乘法來實現的
------------------------------------------------------------------------------------------------------

2.2 仿射變換

仿射變換從集合直觀只有兩個要點:

  • 變換前是直線,變換后也依然是直線
  • 直線的比例保持不變

可見,少了 原點保持不變 的條件,因此可以進行平移:
image.png

上一節2.1中線性變換通過矩陣乘法來實現,仿射變換則不能只通過矩陣乘法來實現,還需要加法
image.png

因此,放射變換可以表示為 \(\vec y = A \vec x + \vec b\)
------------------------------------------------------------------------------------------------

2.3 通過線性變換來完成仿射變換

image.png
可以看到,在高維度上的線性變換可以完成低維度的仿射變換
image.png
這樣我就可以在三維空間下通過\(\left( \begin{matrix} A & \vec b\\ 0 & 1 \\ \end{matrix} \right) \)這個線性變換來操作 z=1 平面上面的二維正方形,完成仿射變換:

image.png
image.png

image.png

cv2的代碼實現:cv2.warpAffine

import cv2
import math
import numpy as np
#1. 讀取原圖
img_raw = cv2.imread("./data/timg.jpg")
#2. 對圖像進行操作
#2.1 平移
M = np.array([[0.5,0,0],[0,0.5,0]],np.float32) #為了便於觀察,先進行縮小
img_tr =cv2.warpAffine(img_raw, M, img_raw.shape[:2])
cv2.imwrite("./data/image_tr.jpg",img_tr)
#2.2 縮放
img_resize =cv2.resize(img_raw,(64,64))
cv2.imwrite("./data/image_resize.jpg",img_resize)
#2.3 旋轉
def rotate(image, angle, center=None, scale=1.0):
    # 獲取圖像尺寸
    (h, w) = image.shape[:2]
    # 若未指定旋轉中心,則將圖像中心設為旋轉中心
    if center is None:
        center = (w / 2, h / 2)
    # 執行旋轉
    M = cv2.getRotationMatrix2D(center, angle, scale)
    rotated = cv2.warpAffine(image, M, (w, h))
    # 返回旋轉后的圖像
    return rotated
img_rotated = rotate(img_raw,90)
cv2.imwrite("./data/img_rotated.jpg",img_rotated)
#2.4 翻轉
# 橫向翻轉圖像
flipped_hori = cv2.flip(img_raw, 1)
cv2.imwrite("./data/flipped_hori.jpg",flipped_hori)

# 縱向翻轉圖像
flipped_ver = cv2.flip(img_raw, 0)
cv2.imwrite("./data/flipped_ver.jpg",flipped_ver)

# 同時在橫向和縱向翻轉圖像
flipped_all = cv2.flip(img_raw, -1)
cv2.imwrite("./data/flipped_all.jpg",flipped_all)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM