zoukankan      html  css  js  c++  java
  • 仿射变换

    参考资料: 马同学:如何通俗的解释仿射变换

    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( egin{matrix} A & vec b\ 0 & 1 \ end{matrix} ight) )这个线性变换来操作 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)
    
  • 相关阅读:
    语言相关
    一道简单DP题
    一道概率题
    Android CrashHandler
    一道简单数学题
    面试中遇到的随机题目
    VMWare 无损扩展磁盘大小
    Android 源码编译记录
    Android handler 内存泄露分析及解决方法
    Android 反编译
  • 原文地址:https://www.cnblogs.com/qiulinzhang/p/11133517.html
Copyright © 2011-2022 走看看