图像的仿射变换:cv2.warpAffine()

概述

图像的几何变换主要包括:平移、旋转、缩放、剪切、仿射、透视等。
图像的几何变换主要分为:刚性变换、相似变换、仿射变换和透视变换(投影变换)

  • 刚性变换:平移+旋转
  • 相似变换:缩放+剪切
  • 仿射变换:从一个二维坐标系变换到另一个二维坐标系,属于线性变换。通过已知3对坐标点可以求得变换矩阵
  • 透视变换:从一个二维坐标系变换到一个三维坐标系,属于非线性变换。通过已知4对坐标点可以求得变换矩阵。
    在这里插入图片描述

仿射变换

仿射变换(Affine Transformation)是指在向量空间中进行一次线性变换(乘以一个矩阵)和一次平移(加上一个向量),变换到另一个向量空间的过程。
仿射变换代表的是两幅图之间的映射关系,仿射变换矩阵为2x3的矩阵,如下图中的矩阵M,其中的B起着平移的作用,而A中的对角线决定缩放,反对角线决定旋转或错切。
在这里插入图片描述
原像素点坐标(x,y),经过仿射变换后的点的坐标是T,则矩阵仿射变换基本算法原理:
在这里插入图片描述
所以仿射变换是一种二维坐标(x,y)到二维坐标(u,v)之间的线性变换,其数学表达式如下:
在这里插入图片描述
这个矩阵是2×3的,但是这会改变原始图像的维度,为此,增加一个维度,构造齐次变换矩阵3×3
在这里插入图片描述

这就保持了图像的‘平直性’和‘平行性’。
平直性:直线、圆弧不变
平行性:平行关系不变,直线相对位置不变,但是夹角可能会改变。

opencv实现

仿射变化需要一个转换矩阵,但是由于仿射变换比较复杂,一般很难直接找到这个矩阵,opencv提供了根据源图像和目标图像上三个对应的点来自动创建变换矩阵,矩阵维度为 2x3。
这个函数是:cv2.getAffineTransform(pos1,pos2)
最后这个矩阵会被传给函数 cv2.warpAffine()来实现仿射变换。

import cv2 
import numpy as np 

img = cv2.imread('me.jpg')
height, width = img.shape[:2]

# 在原图像和目标图像上各选择三个点 
mat_src = np.float32([[0, 0],[0, height-1],[width-1, 0]]) 
mat_dst = np.float32([[0, 0],[100, height-100],[width-100, 100]]) 

# 得到变换矩阵 
mat_trans = cv2.getAffineTransform(mat_src, mat_dst) 
# 进行仿射变换 
dst = cv2.warpAffine(img, mat_trans, (width,height)) 

# 显示 
imgs = np.hstack([img,dst]) 
cv2.namedWindow('imgs', cv2.WINDOW_NORMAL) 
cv2.imshow("imgs",imgs) 
cv2.waitKey(0)

在这里插入图片描述

  • 23
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值