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