图像的仿射变换: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()的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV实现图像的几何变换

opencv图像处理

python-opencv几何变换--仿射变换透视变换

几何变换

[OpenCV] 在DataSpell (PyCharm)使用CV2的时候“代码不提示 + 看不了源码”的解决方案

如何在不使用 cv2.warpAffine() 的情况下翻译图像? [Python 3 和 OpenCV 4.1]