OpenCV图像处理——几何变换原理(python实现和c++实现)
2.1 简介
学习基本的几何变换,几何变换的原理大多都是相似,只是变换矩阵不同,因此,我们以最常用的平移、旋转和翻转为例进行学习。在深度学习领域,我们常用平移、旋转、镜像等操作进行数据增广;在传统CV领域,由于某些拍摄角度的问题,我们需要对图像进行矫正处理,而几何变换正是这个处理过程的基础,因此了解和学习几何变换也是有必要的。
2.2 学习目标
-
了解几何变换的概念与应用
-
理解平移、旋转、翻转的原理
-
掌握在OpenCV框架下实现几何变换操作
2.3 内容介绍
1、平移、旋转、翻转的原理
- 平移
- 旋转
- 翻转
- 复杂的仿射变换
2、OpenCV代码实践
-
c++实现
- 常用函数解析
- 进阶实现(根据原理自己实现)
-
python实现
2.4 算法理论介绍
2.4.1 平移
图像平移就是将图像中所有的点按照平移量水平或者垂直移动。
假设要水平向右侧移动100个像素,向下移动50个像素,则原图像与目标图像的对应关系为:
dst(x,y)=src(x+100,y+50) dst(x,y)=src(x+100,y+50) dst(x,y)=src(x+100,y+50)可以转换为:
dst(x,y)=src(x∗1+y∗0+100,x∗0+y∗1+50) dst(x,y)=src(x*1+y*0+100,x*0+y*1+50) dst(x,y)=src(x∗1+y∗0+100,x∗0+y∗1+50)
对应的矩阵变换为:
[x′y′1]=[xy1][100010100501] \begin{bmatrix} x^{'} & y^{'} &1\\ \end{bmatrix} =\begin{bmatrix} x & y & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0\\ 100 & 50 &1 \end{bmatrix} [x′y′1]=[xy1]⎣⎡101000150001⎦⎤
设txt_{x}tx和tyt_{y}ty分别为水平方向和垂直方向偏移量,水平向右为正,垂直向下为正。
所以平移的转换矩阵格式为:
M=[100010txty1] M= \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0\\ t_{x} & t_{y} & 1 \end{bmatrix} M=⎣⎡10tx01ty001⎦⎤
实际上,在openCV中,只需要传入如下转换矩阵作为参数即可。
M=[10tx01ty] M= \begin{bmatrix} 1 & 0 & t_{x} \\ 0 & 1 & t_{y} \end{bmatrix} M=[1001txty]
2.4.2 旋转
图像旋转是指图像绕着中心转动一定角度的过程,旋转中图像仍保持原始尺寸。图像旋转后图像的水平对称轴、垂直对称轴及中心坐标原点都可能发生变换,因此需要对图像旋转中的坐标进行相应转换。
对于平移,缩放而言,进行变换时以图像的坐标原点(左上角)为基准进行变换即可,但是旋转需要以图像中心为原点,这就需要将图像的坐标进行转换,转换成以中心点为原点的笛卡尔坐标系。
我们知道,图像坐标的原点在图像左上角,水平向右为 X 轴,垂直向下为 Y 轴。数学课本中常见的坐标系是以图像中心为原点,水平向右为 X 轴,垂直向上为 Y 轴,称为笛卡尔坐标系。
图像坐标系与笛卡尔坐标系:
图像坐标系沿xxx轴向右为正方向,沿yyy轴向下为正方向。
笛卡尔坐标系沿xxx轴向右为正方向,沿yyy轴向上为正方向。
图像坐标系与笛卡尔坐标系转换关系:
图像坐标系的原点为AAA,而笛卡尔直角坐标系的原点是OOO。
把一张图像旋转,整个过程可以分为三步:
- 图像坐标系转换为数学坐标系
- 在数学坐标系上进行旋转变换
- 数学坐标系转换为图像坐标系
图像坐标系转换为数学坐标系:
设原图像的为width∗heightwidth*heightwidth∗height的矩阵。
图像的原点坐标(0,0)(0,0)(0,0)在数学坐标系下变为(−width2,height2)(-\frac{width}{2},\frac{height}{2})(−2width,2height)
所以坐标变换可以表示为:
x′=x−width2y′=−y+height2 x^{'} = x-\frac{width}{2}\\ y^{'} = -y+\frac{height}{2} x′=x−2widthy′=−y+2height
可以对应平移的变换矩阵形式:
M=[1000−10−width2height21] M= \begin{bmatrix} 1 & 0 & 0 \\ 0 & -1 & 0\\ -\frac{width}{2} & \frac{height}{2} & 1 \end{bmatrix} M=⎣⎡10−2width0−12height001⎦⎤
在数学坐标系上进行旋转的坐标变换:
如图,旋转前的坐标为(x,y)(x,y)(x,y),与原点的连线长度为rrr,与xxx轴夹角为α\alphaα
x=rcosαy=rsinα x=rcos\alpha\\ y=rsin\alpha x=rcosαy=rsinα
顺时针旋转θ\thetaθ角度后,变为
x′=rcos(α−θ)=r(cosαcosθ+sinαsinθ)=xcosθ+ysinθy′=rsin(α−θ)=r(sinαcosθ−cosαsinθ)=−xsi