Python 图像处理OpenCV:几何变换(笔记)

news2024/11/18 22:59:01

包括图像缩放、图像平移、图像旋转、图像的仿射变换、图像的透射变换及图像金字塔等内容。

图像缩放:

  • 缩放是对图像的大小进行调整,即使图像放大或缩小。
  • cv2.resize(src,dsize,fx=0,fy=0,interpolation=cv2.INTER_LINEAR)
  • src : 输入图像
  • dsize: 绝对尺寸,直接指定调整后图像的大小
  • fx,fy: 相对尺寸,将dsize设置为None,然后将fx和fy设置为比例因子即可
  • interpolation:插值方法

图像平移:

  • 图像平移将图像按照指定方向和距离,移动到相应的位置。
  • cv.warpAffine(img,M,dsize)
  • img: 输入图像
  • M: 2*∗3移动矩阵
  • dsize: 输出图像的大小

图像旋转:

  • 图像旋转是指图像按照某个位置转动一定角度的过程,旋转中图像仍保持这原始尺寸。图像旋转后图像的水平对称轴、垂直对称轴及中心坐标原点都可能会发生变换,因此需要对图像旋转中的坐标进行相应转换。
  • 在OpenCV中图像旋转首先根据旋转角度和旋转中心获取旋转矩阵,然后根据旋转矩阵进行变换,即可实现任意角度和任意中心的旋转效果。
  • cv2.getRotationMatrix2D(center, angle, scale)
  • center:旋转中心
  • angle:旋转角度
  • scale:缩放比例
  • M:旋转矩阵
  • 调用cv.warpAffine完成图像的旋转

图像的仿射变换:

  • 图像的仿射变换涉及到图像的形状位置角度的变化,是深度学习预处理中常到的功能,仿射变换主要是对图像的缩放,旋转,翻转和平移等操作的组合。
  • 需要注意的是,对于图像而言,宽度方向是x,高度方向是y,坐标的顺序和图像像素对应下标一致。所以原点的位置不是左下角而是右上角,y的方向也不是向上,而是向下。
  • 在仿射变换中,原图中所有的平行线在结果图像中同样平行。为了创建这个矩阵我们需要从原图像中找到三个点以及他们在输出图像中的位置。然后cv2.getAffineTransform
    会创建一个 2x3 的矩阵,最后这个矩阵会被传给函数 cv2.warpAffine。

图像的透射变换:

  • 透射变换是视角变化的结果,是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。
  • 在opencv中,我们要找到四个点,其中任意三个不共线,然后获取变换矩阵T,再进行透射变换。通过函数cv.getPerspectiveTransform找到变换矩阵,将cv.warpPerspective应用于此3x3变换矩阵。

图像金字塔:

  • 图像金字塔是图像多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构。

  • 图像金字塔用于机器视觉和图像压缩,一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。

  • 金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似,层级越高,图像越小,分辨率越低。

  • cv.pyrUp(img) #对图像进行上采样

  • cv.pyrDown(img) #对图像进行下采样

总结:

图像缩放:

  • 对图像进行放大或缩小 cv.resize()

图像平移:

  • 指定平移矩阵后,调用cv.warpAffine()平移图像

图像旋转:

  • 调用cv.getRotationMatrix2D获取旋转矩阵,然后调用cv.warpAffine()进行旋转

仿射变换:

  • 调用cv.getAffineTransform将创建变换矩阵,最后该矩阵将传递给cv.warpAffine()进行变换

透射变换:

  • 通过函数cv.getPerspectiveTransform()找到变换矩阵,将cv.warpPerspective()进行投射变换

金字塔:

  • 图像金字塔是图像多尺度表达的一种,使用的API:
  • cv.pyrUp(): 向上采样
  • cv.pyrDown(): 向下采样

代码如下:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
fengjing = cv.imread("./image/fengjing.jpg")
plt.imshow(fengjing[:, :, ::-1])
plt.show()
# 获取图像的绝对尺寸
rows, cols = fengjing.shape[:2]
print(rows)
print(cols)
'''
    对图像的大小进行调整,即图像的放大或缩小
    cv.resize(src,dsize,fx=0,fy=0,interpolation=cv2.INTER_LINEAR)
    src:输入图像
    dsize:绝对尺寸,直接指定调整后图像的大小
    fx,fy:相对尺寸,将dsize设置为None,然后将fx和fy设置为比例因子即可。
    interpolation:插值方法
'''
# 调整绝对尺寸,放大
res = cv.resize(fengjing, (2*rows, 2*cols))
plt.imshow(res[:, :, ::-1])
plt.show()
print(res.shape)
# 调整相对尺寸,缩小
res1 = cv.resize(fengjing, None, fx=0.5, fy=0.5)
plt.imshow(res1[:, :, ::-1])
# 翻转是因为用cv读图像默认是的通道是BGR,用plt输出要RGB。
plt.show()
print(res1.shape)
'''
    平移
    cv.warpAffine(img,M,dsize)
    img: 输入图像
    M:2*3移动矩阵 
        注意:将M设置为np.float32类型的Numpy数组。
    dsize:输出图像的大小 
        注意:输出图像的大小,应该是(宽度,高度)的形式,请记住,width=列数,height=行数。
'''
# 平移
M = np.float32([[1, 0, 100], [0, 1, 50]])
res3 = cv.warpAffine(fengjing, M, (cols, rows))
plt.imshow(res3[:, :, ::-1])
plt.show()
'''
    旋转
        在OpenCV中图像旋转首先根据旋转角度和旋转中心获取旋转矩阵,
    然后根据旋转矩阵进行变换,即可实现任意角度和任意中心的旋转效果。
    cv2.getRotationMatrix2D(center, angle, scale)
    center:旋转中心
    angle:旋转角度
    scale:缩放比例
    返回 M:旋转矩阵
    而后调用cv.warpAffine完成图像的旋转
'''
# 旋转
# 获取旋转矩阵
M = cv.getRotationMatrix2D((cols/2, rows/2), 45, 1)
# 旋转中心指定为图像的中间位置,旋转45度,缩放比例为1,即不进行缩放。
res5 = cv.warpAffine(fengjing, M, (cols, rows))
plt.imshow(res5[:, :, ::-1])
plt.show()
'''
    仿射变换
        图像的仿射变换涉及到图像的形状位置角度的变化,
    是深度学习预处理中常到的功能,仿射变换主要是对图像
    的缩放,旋转,翻转和平移等操作的组合。
        那什么是图像的仿射变换,如下图所示,图1中的点1, 2 和 3 与图二中三个点一一映射, 
    仍然形成三角形, 但形状已经大大改变,通过这样两组三点(感兴趣点)求出仿射变换, 接下
    来我们就能把仿射变换应用到图像中所有的点中,就完成了图像的仿射变换。
'''
# 仿射变换
# 原始图像的位置
pta1 = np.float32([[50, 50], [190, 50], [50, 190]])
# 仿射图像的位置
pta2 = np.float32([[100, 100], [190, 50], [100, 260]])
# 构建变换矩阵
M = cv.getAffineTransform(pta1, pta2)
print(M)
res7 = cv.warpAffine(fengjing, M, (cols, rows))
plt.imshow(res7[:, :, ::-1])
plt.show()
'''
    透射变换
        透射变换是视角变化的结果,是指利用透视中心、像点、目标点三点共线的条件,
    按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影
    光线束,仍能保持承影面上投影几何图形不变的变换。
'''
# 投射变换
pst1 = np.float32([[56, 65], [368, 53], [28, 387], [389, 390]])
pst2 = np.float32([[100, 150], [300, 100], [80, 290], [310, 300]])
T = cv.getPerspectiveTransform(pst1, pst2)
print(T)
res9 = cv.warpPerspective(fengjing, T, (cols, rows))
plt.imshow(res9[:, :, ::-1])
plt.show()
'''
    图像金字塔
        图像金字塔是图像多尺度表达的一种,最主要用于图像的分割,
    是一种以多分辨率来解释图像的有效但概念简单的结构。
        图像金字塔用于机器视觉和图像压缩,一幅图像的金字塔是一系列以金字塔
    形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下
    采样获得,直到达到某个终止条件才停止采样。
        金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似,层级
    越高,图像越小,分辨率越低。
    cv.pyrUp(img)       #对图像进行上采样
    cv.pyrDown(img)     #对图像进行下采样
'''
# 图像金字塔
# 上采样
imgup = cv.pyrUp(fengjing)
plt.imshow(imgup[:, :, ::-1])
plt.show()
imgup1 = cv.pyrUp(imgup)
plt.imshow(imgup1[:, :, ::-1])
plt.show()
# 下采样
imgdown = cv.pyrDown(fengjing)
plt.imshow(imgdown[:, :, ::-1])
plt.show()

输出结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


欢迎大家查看作者的主页,主页中还有关于编程与算法方面的更多内容,欢迎大家相互沟通学习~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/815.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux运维面试题总结—Linux基础、计算机网络基础

文章目录一、三次握手四次挥手二、如何划分vlan三、为什么划分vlanvlan三个模式:vxlan和vlan区别是什么?四、OSI七层模型及对应协议五、Linux中 查找大于10M的文件并删除六、查看cup占用情况,查看内存,查看磁盘IO使用情况&#xf…

图像处理黑科技——弯曲矫正、去摩尔纹、切边增强、PS检测

目录0 前言1 弯曲矫正2 去摩尔纹3 图像切边增强4 PS检测5 总结0 前言 合合信息是行业领先的人工智能及大数据科技企业,专注文字识别领域16年,在智能文字识别及商业大数据等核心领域处于国内领先地位,全球企业和个人用户提供创新的数字化、智…

代码随想录动态规划——一和零

题目 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的大小,该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。 示例 1: 输入:strs [“10…

Oracle Unifier 系统架构简述(安装部署)

关于Oracle Primavera Unifier 的应用架构,其实在我之前的博客已有介绍相关内容 谈谈 Oracle P6 , Unifier 和其他应用系统间的联系https://campin.blog.csdn.net/article/details/104972949 从官方文档方面,其实在《unifier_performance_and_sizing_g…

【C语言】全面解析数据在内存中的存储

文章目录前言类型的基本分类整型浮点数自定义类型整型在内存中的存储原码、反码、补码大端和小端如何判断编译器是大端还是小端浮点数在内存中的存储总结前言 C语言中有char、short、int、long、long long、float和doubole这些数据类型。这些数据类型也叫内置类型。 所占存储空…

JECloud微服务低代码平台重大发布。

JECloud微服务低代码平台【1.0.0】版升级发布,本次发布内容如下: JECloud微服务低代码平台是一款基于元数据领域模型构建的低代码开发平台,其底层采用微服务与微应用构建底层框架,并基于基础框架构建各核心微服务模块来实现低代码…

手撕七大排序 (四)

归并排序归并排序递归写法一. 基本概念二. 图解归并排序递归写法 一. 基本概念 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并…

数据结构与算法——链表(双向链表,顺序表与链表的比较)

🍓个人主页:bit.. 🍒系列专栏:Linux(Ubuntu)入门必看 C语言刷题 数据结构与算法 目录 一.双向链表 二.双向链表的对称性:(设指针p指向某一结点) 1.双向链表的插入 2.双向链表的删除 …

浏览器中的页面循环系统

【】渲染进程中有个主线程处理安排好的任务,为了在线程运行过程中接收并处理新任务,引入了事件循环机制;为了处理其他线程发送来的任务,引入消息队列;为了处理其他进程发送来的任务,渲染进程专门有一个IO线…

【数据结构初阶】二、顺序表的实现

目录 一、线性表 二、顺序表 2.1 顺序表概念及结构 2.2 顺序表接口实现 2.2.1 顺序表初始化 2.2.2 顺序表的销毁 2.2.3 顺序表的打印 2.2.4 顺序表增加数据(插入,头插、尾插) 2.2.5 顺序表删除数据(删除,头删…

Uniapp集成腾讯IM+音视频通话

腾讯IM(包含界面)源码下载相关配置 传送门:https://cloud.tencent.com/document/product/269/36887 传送门:https://github.com/TencentCloud/TIMSDK/tree/master/uni-app vue2 vue3都可 笔者用的vue2 解压文件 拖到编辑器 #项目右键 在命令行窗口打开 …

Promethues原理详解

目录 引言 一、Prometheus概念 1.1、什么是Prometheus 1.2、Zabbix和Prometheus区别 1.3、Prometheus的特点 二、运维监控平台设计思路 三、Prometheus监控体系 3.1、系统层监控(需要监控的数据) 3.2、中间件及基础设施类监控 3.3、应用层监控…

语音合成经典模型结构介绍

(以下内容搬运自 PaddleSpeech) Models introduction TTS system mainly includes three modules: Text Frontend, Acoustic model and Vocoder. We introduce a rule-based Chinese text frontend in cn_text_frontend.md. Here, we will introduce acoustic models and voc…

XDataverse免费的统一数据库管理工具

XDataverse产品简介 XDataverse是一款通用的数据库管理工具,主要管理关系型数据库,同时也支持一些其余类型的数据库,比如Redis。其主要功能有 支持主流关系型数据库的常规操作,比如MySQL,SQLServer,SQlite,SQLCE,Postg…

机器学习 逻辑回归(2)softmax回归多类别分类-鸢尾花案例

机器学习 逻辑回归之softmax回归多类别分类-鸢尾花案例一、前言二、假设函数三、One-Hot 独热编码四、代价函数五、梯度下降六、原生代码实现6.1 加载并查看数据6.2 添加前置与数据分割6.3 迭代训练6.4 验证数据七、sklearn代码实现八、参考资料PS:softmax回归损失函…

[时间序列预测]基于BP、LSTM、CNN-LSTM神经网络算法的单特征用电负荷预测[保姆级手把手教学]

系列文章目录 深度学习原理-----线性回归梯度下降法 深度学习原理-----逻辑回归算法 深度学习原理-----全连接神经网络 深度学习原理-----卷积神经网络 深度学习原理-----循环神经网络(RNN、LSTM) 时间序列预测-----基于BP、LSTM、CNN-LSTM神经网络…

安卓开发Android studio学习笔记14:用户注册登录(案例演示)

Android studio学习笔记第一步:配置activity_information.xml第二步:配置activity_registration.xml第三步:配置strings.xml第四步:配置InformationActivity第五步:配置RegistrationActivity第六步:运行结果…

二叉搜索树

文章目录二叉搜索树1. 概念2. 模拟实现二叉搜索树2.1 准备工作 创建类2.2 查找方法2.3 插入方法2.4 删除方法3. 性能分析二叉搜索树 前言 : 1. 概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不…

学点高端技术:基于密度的聚类算法——FDBSCAN算法

机器学习、人工智能各类KNN算法层出不穷,DBSCAN具有强代表性,它是一个基于密度的聚类算法,最大的优点是能够把高密度区域划分为簇,能够在高噪声的条件下实现对目标的精准识别,但该算法当前已远不能满足人们对于高效率、…

零基础自学javase黑马课程第二天

零基础自学javase黑马课程第二天 ✨欢迎关注🖱点赞🎀收藏⭐留言✒ 🔮本文由京与旧铺原创,csdn首发! 😘系列专栏:java学习 💻首发时间:🎞2022年10月16日&#…