图像的仿射变换:cv2.warpAffine()
Posted 一只眠羊e
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像的仿射变换: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)
以上是关于图像的仿射变换:cv2.warpAffine()的主要内容,如果未能解决你的问题,请参考以下文章