day7 - 使用几何变换让图像动起来

news2024/11/19 9:20:50

本期将了解图像的几何变换。几何变换是指改变图像的几何结构,例如大小、角度和形状等,让图像呈现出缩放、翻转、映射和透视的效果。

完成本期内容,你可以:

  • 了解几何变换的定义
  • 掌握几何变换的原理和使用

若要运行案例代码,你需要有:

  • 操作系统:Ubuntu 16 以上 或者 Windows10

  • 工具软件:VScode 或者其他源码编辑器

  • 硬件环境:无特殊要求

  • 核心库:python 3.6.13, opencv-contrib-python 3.4.11.39,opencv-python 3.4.2.16

点击下载源码


图像缩放

OpenCV中提供的图像缩放的函数是cv2.resize()。

函数原型: dst = cv2.resize(src, dsize, fx, fy, interpolation);

dst为变换后的图像。

参数描述如下:

参数描述
src原始图像
dsize输出图像的大小
fx可选参数,水平方向的缩放比例
fy可选参数,竖直方向的缩放比例
interpolation可选参数,缩放的插值方式,在图像缩小或放大时需要删减或补充像素,该参数可以指定使用哪种算法对像素进行增减。建议使用默认值。

仿射变换

仿射变换是一种仅发生在二维平面内的几何变换,变换之后的图像仍然可以保持直线的“平直性”和“平行性”,也就是说原来的直线变换之后还是直线,平行线变换之后还是平行线。常见的仿射变换包含:平移、旋转和倾斜。

请添加图片描述

OpenCV中提供的用于仿射变换的函数是cv2.warpAffine()。

函数原型: dst = cv2.warpAffine(src, M, dsize, flags, borderMode,borderValue);

dst为变换后的图像

参数描述如下:

参数描述
src原始图像
M矩阵,根据此矩阵的值变换原图中的像素位置
dsize输出图像的尺寸大小
flags可选参数,插值方式,建议使用默认值
borderMode可选参数,边界类型,建议使用默认值
borderValue可选参数,边界值,默认为0,建议使用默认值

平移

  • 平移的仿射矩阵M

请添加图片描述

旋转

OpenCV中提供的用于获取旋转矩阵的函数是cv2.getRotationMatrix2D()。

函数原型: retval=cv2.getRotationMatrix2D(center, angle, scale)

retal为转换矩阵。

参数描述如下:

参数描述
center旋转的中心点
angle旋转角度,正数表示逆时针旋转、负数表示顺时针旋转
scale变换尺度(缩放大小)

倾斜

OpenCV中提供的用于获取倾斜矩阵的函数是cv2.getPerspectiveTransform()。

函数原型: retval = cv2.getPerspectiveTransform( src, dst )

retal为转换矩阵。

参数描述如下:

参数描述
src输入图像的四个点坐标
dst输出图像的四个点坐标

具体步骤

1. 创建项目结构

创建项目名为使用几何变换让图像动起来,项目根目录下新建code文件夹储存代码,新建dataset文件夹储存数据,项目结构如下:

使用几何变换让图像动起来                   # 项目名称
├── code                               # 储存代码文件
├── dataset                            # 储存数据文件

注:如项目结构已存在,无需再创建。

2. 使用图像几何变换将图像缩小

  1. code文件夹下创建downsize.py文件;
  2. 读取dataset文件夹下的scenery.png图片,并进行展示 ;
  3. 将图像缩小一半;
  4. 将缩小后的图片保存至dataset文件夹,名为scenery1.png
  5. 无限等待用户输入按键,按下按键后销毁所有窗口。

代码实现

# 导入OpenCV
import cv2
# 读取图像
img = cv2.imread("../dataset/scenery.png")
# 将图像缩小一半
dst = cv2.resize(img, (0, 0),fx=0.5,fy=0.5)
# 保存缩小后的图像
cv2.imwrite('../dataset/scenery1.png',dst)

# 显示图像
cv2.imshow("img", img)
cv2.imshow("dst2", dst)
cv2.waitKey()
cv2.destroyAllWindows()

请添加图片描述

实验效果

3. 使用几何变换进行图像平移

  1. code文件夹下创建pan.py文件;
  2. 读取dataset文件夹下的scenery.png图片,并进行展示 ;
  3. 将图像向右平移50像素,向下平移100像素,并进行展示;
  4. 无限等待用户输入按键,按下按键后销毁所有窗口。

代码实现

# 导入OpenCV、NumPy
import cv2
import numpy as np

# 读取图像
img = cv2.imread("../dataset/scenery.png")  # 读取图像

# 获取图像尺寸
rows = img.shape[0]  # 图像像素行数
cols = img.shape[1] # 图像像素列数

# 平移矩阵M
M = np.float32([[1, 0, 50],  # 横坐标向右移动50像素
                [0, 1, 100]])  # 纵坐标向下移动100像素
# 仿射变换
dst = cv2.warpAffine(img, M, (cols, rows))


cv2.imshow("img", img)  # 显示原图
cv2.imshow("dst", dst)  # 显示仿射变换效果
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

4. 使用几何变换将图像进行旋转

  1. code文件夹下创建rotate.py文件;
  2. 读取dataset文件夹下的scenery.png图片,并进行展示 ;
  3. 将图像以图像中心点为中心,逆时针旋转30度,缩小0.7倍,并进行展示;
  4. 无限等待用户输入按键,按下按键后销毁所有窗口。

代码实现

# 导入OpenCV
import cv2

# 读取图像
img = cv2.imread("../dataset/scenery.png")

# 获取像素尺寸,确定旋转中心点
rows = img.shape[0] # 图像像素行数
cols = img.shape[1] # 图像像素列数
center = (rows / 2, cols / 2)  # 图像的中心点

# 图像旋转
M = cv2.getRotationMatrix2D(center, 30, 0.7)  # 以图像为中心,逆时针旋转30度,缩放0.8倍
dst = cv2.warpAffine(img, M, (cols, rows))  # 按照M进行仿射


cv2.imshow("img", img)  # 显示原图
cv2.imshow("dst", dst)  # 显示仿射变换效果
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

请添加图片描述

实验效果

图像的几何变换在图像预处理的过程中用到的很多,对于一些拍摄角度存在偏差的图像,进行角度的调整有这非常好的效果。

点击下载源码

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

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

相关文章

【正点原子STM32连载】 第十五章 按键输入实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id609294757420 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第十五…

Vue之MVVM模型

文章目录 前言一、简说MVVM模型二、走进MVVM总结 前言 Vue的创建者在创建Vue时没有完全遵守MVVM(一种软件架构模式),但是Vue的设计受到了他它的启发。这也是为什么经常用vm(ViewModel的缩写)这个变量名表示Vue实例。 …

服了呀,被现在的00后卷麻了....

现在的小年轻真的卷得过分了。前段时间我们公司来了个00年的,工作没两年,跳槽到我们公司起薪18K,都快接近我了。后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天,原来这位小老弟家里条…

docker创建emqx容器,emqx版本4.4.9

题记:网上找了很多文章,都没能怎么说明白如何对mqtt连接通信做认证,也就是tcp方式的时候,携带user、password,很苦恼,最后找了一大圈,说emqx的4.4.9版本的Dashboard有插件,果然顺藤摸…

vue动态class的写法

本文会详细介绍 vue动态 class的写法,并且提供一些我个人的理解,希望对你有所帮助。 如果你是一个新手,或者想了解 vue的源码,那么首先应该学习 vue的基础知识,比如:什么是静态语言,有什么作用等…

155. 最小栈

题目描述&#xff1a; 主要思路&#xff1a; 利用辅助栈来实现&#xff0c;一个最小栈用类似于单调栈的方法进行维护&#xff0c;具体见代码。 class MinStack { private:stack<int> x;stack<int> minx; public:MinStack() {minx.push(INT_MAX);}void push(int v…

IMX6ULL的I2C驱动详细分析

IMX6ULL的I2C驱动详细分析 文章目录 IMX6ULL的I2C驱动详细分析i2c_imx_driver 的平台驱动注册i2c_imx_probe注册函数i2c_imx_algoI2C算法结构体i2c_imx_start开始I2Ci2c_imx_stop停止I2Ci2c_imx_isr中断服务函数i2c_imx_dma_writeDMA 进行写操作的 I2C 传输2c_imx_dma_readi2c_…

动图怎么拆分成静图?简单快速分解gif的方法

怎么把gif动图变成静态图片&#xff1f;常见的gif动图画面生动丰富&#xff0c;是由一帧一帧静态的图片合成的&#xff0c;当我们想要把gif动图拆分成多张图片的时候要怎么操作呢&#xff1f;有没有什么简单方便的工具吗&#xff1f; 一、有没有简单方便的gif工具呢&#xff1…

Linux内存简介

Linux内存简介 概述 为何MemTotal小于RAM容量 [rootiZbp1dphe2bpv39op1g123Z ~]# dmesg | grep Memory [ 1.391064] Memory: 131604168K/134217136K available (14346K kernel code, 9546K rwdata, 9084K rodata, 2660K init, 7556K bss, 2612708K reserved, 0K cma-reserved) …

云原生改造- istio

istio 官网有bookinfo的案例&#xff0c; 但是这个案例过于繁琐&#xff0c;直接就可以运行&#xff0c;但是有些原理不是很清楚。 本教程是k8s改造成istio一个案例。spring-petclinic-msa是网上找到的一个k8s的一个java案例&#xff0c;通过spring-petclinic-msa改造成istio&a…

盘点团队在线帮助文档怎么做?

团队在线帮助文档是一个非常重要的工具&#xff0c;它可以帮助团队成员更好地协作和沟通&#xff0c;提高工作效率&#xff0c;并减少沟通成本。在本文中&#xff0c;我们将会盘点团队在线帮助文档的各个方面&#xff0c;以帮助您更好地了解如何创建一个高效的在线帮助文档。 …

6. python的for循环

文章目录 一、for循环1.1、for循环分析1.2、注意事项 二、遍历数值列表2.1、range()函数的使用2.2、 创建数值列表2.3、对数值列表进行简单统计 一、for循环 有时&#xff0c;我们需要对列表内的所有元素逐一进行相同的操作&#xff0c;为避免出现大量重复的代码&#xff0c;p…

js一行代码就能完成的事情,为什么要写两行

三元运算符 用三元运算符代替简单的if else if (age < 18) { me 小姐姐; } else { me 老阿姨; }改用三元运算符,一行就能搞定 me age < 18 ? 小姐姐 : 老阿姨;复杂的判断三元运算符就有点不简单易懂了 const you "董员外" const your "菜…

一周吃透Java面试八股文(2023最新整理

Java就业大环境仍然根基稳定&#xff0c;市场上有很多机会&#xff0c;技术好的人前景就好&#xff0c;就看你有多大本事了。小编得到了一份很不错的资源&#xff0c;建议大家可以认真地来看看以下的资料&#xff0c;来提升一下自己的核心竞争力&#xff0c;在面试中轻松应对面…

如何在WordPress页面上显示或隐藏小部件?

您想在 WordPress 网站的特定页面上显示或隐藏小部件吗&#xff1f; 默认情况下&#xff0c;当您将小部件添加到您的网站时&#xff0c;它们将显示在所有页面上。但是&#xff0c;有时您可能只想在某些页面上显示选定的小部件可以帮助您更好地自定义您的网站并提供个性化的用户…

如何在 Fedora 37 上安装 FileZilla?

FileZilla 是一款流行的开源 FTP&#xff08;文件传输协议&#xff09;客户端&#xff0c;它提供了一个直观的界面来管理和传输文件。本文将详细介绍如何在 Fedora 37 上安装 FileZilla。以下是安装过程的详细步骤&#xff1a; 步骤一&#xff1a;更新系统 在安装任何软件之前…

【大数据之Hive】一、Hive概念及框架原理

1 Hive概念 Hive是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张表&#xff0c;并提供类SQL查询功能&#xff0c;主要完成海量数据的分析和计算。 优点&#xff1a;简化数据开发流程及提高了效率。 2 Hive本质 Hive是一个Hadoop客户端&#xff…

【golang】2、http client、爬图

文章目录 一、http client爬取并存储 jpg 用 golang 可以很方便的爬图&#xff08;http 下载图片&#xff0c;存储为 jpg 格式&#xff09;。 一、http client http client 有如下最佳实践&#xff1a; 尽量用 default http client&#xff1a;默认的 http client 设置了很多…

排序算法——堆排序

把上面的序列变成一个完全二叉树&#xff0c;要想实现大顶堆&#xff08;大顶堆&#xff1a;叶子节点不考虑&#xff0c;每个节点都要比他的两个孩子节点要大&#xff09;&#xff0c;就要进行如下操作&#xff0c;你会发现len/2就是最后一个非叶子节点 第一步是从下往上调 9和…

Apache Pulsar部署搭建

1.部署规划 部署 Pulsar 集群包括以下步骤(按顺序)&#xff1a; 1.部署一个 ZooKeeper 集群&#xff0c;初始化 Pulsar 集群元数据。2.部署一个 Bookeeper 集群。3.部署一个或多个 Pulsar brokers。4.部署 Pulsar manager&#xff08;可选&#xff09;。 2.节点规划 主机名…