几何变换大致分为仿射变换、投影变换、极坐标变换

完成几何变换需要两个独立的算法过程

1、一个用来实现空间坐标变换的算法,用它描述每个像素如何从初始位置移动到终止位置

2、一个插值算法完成输出图像的每个像素的灰度值

一、仿射变换

二维空间的仿射变换可以描述为:

改写为矩阵乘法的表示方式:

右边3x3的矩阵就是仿射变换矩阵一般形式,根据不同的变换,比如平移、旋转等等,仿射变换矩阵的值是不一样的。

1、平移

假设空间坐标

先沿
轴平移
,在沿
轴平移
,则变换后的坐标为
,仿射变换矩阵为:

其中,若

,表示向
轴负方向平移,若
,表示向
轴正方向平移。

2、缩放

二维空间坐标

以任意一点
为中心在水平方向和垂直方向上分别缩放
倍,缩放后坐标为
,通俗来讲就是缩放后的坐标离中心点的水平距离变为原坐标离中心点水平距离的
倍。

为原点
时,缩放变换可以表示为:

为任意点时,变换过程理解为,先将中心点平移到原点,再以原点为中心进行缩放,然后移回到原来的中心点。缩放变换表示为:

注意:等式右边的运算应该从右往左看

3、旋转

如图,假设坐标

绕着原点顺时针旋转
,假设
到原点的距离为
,则

由上述方程解得:

同理可得当坐标
绕着原点顺时针旋转
,即把顺时针情况下的
改为

所以顺时针绕原点

旋转变换的矩阵表示为:

如果

绕任意一点
顺时针旋转
,坐标变换表示为:

二、计算仿射变换矩阵

1、解方程法

已知变换前的位置坐标和变换后的位置坐标,计算仿射矩阵,仿射矩阵有6个未知数,需要6个方程,所以需要3组对应位置的坐标,opencv提供的函数cv2.getAffineTransform(src,dst)

代码示例如下:

import cv2
import numpy as np
src = np.array([[0,0],[200,0],[0,200]],np.float32) #变换前的坐标,坐标值必须为32位浮点型
dst = np.array([[0,0],[100,0],[0,100]],np.float32) #变换后的坐标,坐标值必须为32位浮点型
A = cv2.getAffineTransform(src,dst) #计算仿射变换矩阵

2、矩阵法

使用矩阵相乘的方法计算仿射矩阵,必须知道基本的仿射变换步骤,比如先缩放后平移,遵循等式右边的运算应该从右往左看的原则,则变换的矩阵为:

特殊情况如果是等比例缩放,缩放和旋转位置可以互换,也就是如果以点

为中心先进行缩放,然后顺时针旋转
,等价于先进行顺时针旋转
在进行缩放处理,对于这种等比例缩放的仿射变换,opencv提供函数

cv2.getRotationMatrix2D(center,angle,scale)计算仿射变换矩阵。

center:变换中心的坐标

angle:逆时针旋转的角度,如果为负数,则为顺时针,单位为角度,不是弧度

scale:等比例缩放系数

三、插值算法
可以将图像理解为一个二维函数

,水平方向为
轴,垂直方向为
轴,原点在矩阵的左上角。

已知输入图像的坐标

和输出图像的坐标
的空间变换关系,且已知输入图像函数
,我们要计算输出图像函数
需要手动设置的。

比如,我们要放大图像两倍,

仿射变换后的坐标为
,但是
无法得知,或者反过来想,要想得到
,必须知道
, 而
可以通过四个相邻的整数坐标
估算出来,也就是我们要讲的插值算法。

总的来说就是输出图像的坐标

通过逆映射回坐标
,如果
在原输入图像范围内,且坐标值为非整数,则可以用插值算法计算此处的函数值。如果

在原输入图像矩阵范围外面,就不能使用插值算法,使用预先设置的常数即可。

所以问题转化为,如何利用输入图像已知的整数坐标处的函数值估算非整数坐标处的函数值

1、最近邻插值

对于非整数坐标

,他的四个相邻整数坐标为
,最近邻插值就是从它的四个相邻整数坐标找出离它最近的坐标的值来代替它的值

缺点:图像放大处理后明显出现锯齿状外观

2、双线性插值(最常用)

要估计输入图像非整数坐标

的值,分为三个步骤

第一步:先用线性关系估计输入图像中

的值

第二步:同理用线性关系估计输入图像中

的值

第三步:根据前两步得到的值,用线性关系估计输入图像中

的值

opencv提供了cv2.warpAffine(src,M,dsize,flags,bordMode, borderValue)完成几何变换

src:输入图像矩阵

M:2行3列的仿射变换矩阵

dsize: 二元元组(宽,高),代表输出图像大小

flags: 插值法 INTER_NEAREST、INTER_LINEAR(默认)

bordMode: 填充模式,默认BORDER_CONSTANT

bordValue: 当填充模式为BORDER_CONSTANT时的填充值

matlab 通过矩阵变换使图像旋转平移_opencv图像处理——几何变换相关推荐

  1. matlab 通过矩阵变换使图像旋转平移_数字图像处理|P11 第三章 第四节 图像的几何变换...

    第四节 几何变换 图像生成过程中,由于系统本身具有非线性或拍摄角度不同,会使生成的图像产生几何失真.几何失真一般分为系统失真和非系统失真,系统失真是有规律的.能预测的:非系统失真则是随机的.例如:(1 ...

  2. matlab 通过矩阵变换使图像旋转平移_28. 图像扭曲

    本文同步发表在我的微信公众号"计算摄影学",欢迎扫码关注 你有没有想过,下面这个视频中的特效应该如何实现? Morphing Female Starshttps://www.zhi ...

  3. matlab 通过矩阵变换使图像旋转平移_图像的几何变换

    学习图像中的仿射变换(affine transform), 这是一种线性变换(涵盖旋转,平移,错切(shear), 缩放等线性变换),既然是线性变换则可以通过线性变换(矩阵)来获得.仿射变换矩阵M为2 ...

  4. matlab练习程序(图像旋转,最邻近插值)

    cl;H=1; %索引pix中第一个元素,即高度W=2; %索引pix中第二个元素,即宽度jiaodu=45; %要旋转的角度,旋转方向为顺时针img=imread('Corner.png'); %这 ...

  5. opencv 图像雾检测_OpenCV图像处理-基于OpenPose的关键点检测

    OpenCV基于OpenPose的手部关键点检测 概述 ✔️ 手部关键点检测,旨在找出给定图片中手指上的关节点及指尖关节点, 其中手部关键点检测的应用场景主要包括: 手势识别 手语识别与理解 手部的行 ...

  6. 【OpenCV3】图像旋转与平移——cv::warpAffine()详解

    图像旋转和平移是图像处理中常用的一种操作,opencv2和opencv3中对图像的旋转和平移都是通过仿射变换函数cv::warpAffine()来实现的. 1.图像的旋转 图像的旋转具体实现分为两步: ...

  7. 【数字图像处理】MATLAB实现图像旋转

    前言 上节课学习了实现图像旋转的原理,下课后用matlab实现了一下图像旋转的功能,这里做个记录. 图像旋转原理 图像旋转的本质利用的是向量的旋转. 矩阵乘法的实质是进行线性变换,因此对一个向量进行旋 ...

  8. 帮我生成一份能够使图像感情化的Matlab代码

    您可以使用以下Matlab代码来使图像感情化:I = imread('图片.jpg'); %读取图片J = imadjust(I, [0.5 0.7], [0 1]); %调整图片亮度K = imfi ...

  9. Matlab图像的平移,旋转,缩放,裁剪

    %%------------------------Matlab图像的平移,旋转,缩放,裁剪------------------------------- %-------------------头文 ...

最新文章

  1. 调用存储过程时报错:There is no ‘username’@'host’ registered
  2. win7一直提示格式化磁盘_win10磁盘分区操作步骤
  3. 学生创客 开公司造3D打印机
  4. 带入gRPC:gRPC Streaming, Client and Server
  5. informatica中的workflow连接远程数据库
  6. python多个进度条_多个芹菜进度条
  7. 移除镜像_这是否是你心目中的英雄联盟手游?镜像地图。水晶塔,传送移除
  8. 编码速度非常慢_有BUG?MySQL中的 utf8 居然并不是真正的UTF-8编码?
  9. Object -C self -- 笔记
  10. Linux红帽认证管理员(RHCAS)考试笔记
  11. 浙大计算机考研分数线2016,浙江大学2016考研复试分数线
  12. 用cmd命令行在windows系统中进行分区操作
  13. CISCO3945E/K9路由器license激活教程
  14. c++实现多对多生产者消费者和socket连用
  15. Git恢复工作区文件
  16. Charles抓包工具的安装操作以及可能出现的问题(安装不了证书、手机不能上网)
  17. UPC6605 所罗门王的宝藏
  18. 基于SSM的商城管理系统
  19. Python爬虫之爬取网站图片
  20. A Knight‘s Journey(POJ-2488)

热门文章

  1. Spring Cloud Alibaba基础教程:几种服务消费方式(RestTemplate、WebClient、Feign)
  2. 在前后端分离的路上承受了多少痛?看看这篇是否能帮到你?
  3. 强力攻城狮的职位要求...
  4. 消息中间件—简谈Kafka中的NIO网络通信模型
  5. java mysql aio_Java中的NIO,BIO,AIO分别是什么
  6. ionic4中的手势事件
  7. Don‘t support broadcast for binaryOp,
  8. mnn c++ windows 调用实例
  9. GNOME启动时激活NumLock
  10. VS2019配置opencv环境时找不到Microsoft.Cpp.x64.user.props