OpenCV——几何变换原理(python实现和c++实现)

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(x1+y0+100,x0+y1+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} [xy1]=[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 widthheight的矩阵。

图像的原点坐标 ( 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=x2widthy=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=102width012height001

在数学坐标系上进行旋转的坐标变换:

在这里插入图片描述

如图,旋转前的坐标为 (

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值