机器视觉学习(五)—— 图像的几何

一、图像的几何变化

图像的几何变化指的是通过改变图像的位置、尺寸和方向等参数来实现的图像变换。常见的图像几何变化包括平移、旋转、缩放和翻转等。

  1. 平移:将图像在平面上按照指定的平移距离水平或垂直移动。

  2. 旋转:按照指定的角度将图像绕中心或其他指定点进行旋转。

  3. 缩放:按照指定的比例增大或缩小图像的尺寸。

  4. 翻转:在水平或垂直方向上反转图像,得到镜像效果。

除了上述基本的几何变换,还可以进行透视变换、扭曲变换、仿射变换等复杂的图像变换,实现更加丰富的效果。

1.1 图像的翻转

在OpenCV中,可以使用函数cv2.flip()来实现图像的翻转。该函数接受三个参数:

  • src:要翻转的输入图像。
  • flipCode:指定翻转的方式。可以是以下三个值之一:
    • 0:沿x轴翻转(垂直翻转)。
    • 1:沿y轴翻转(水平翻转)。
    • -1:同时沿x轴和y轴翻转(同时水平和垂直翻转)。
  • dst:可选参数,指定输出图像。如果不提供,则函数会在原始图像上进行翻转。

下面是一个使用cv2.flip()函数来对图像进行翻转的示例:

import cv2# 加载图像
image = cv2.imread('image.png')            # 在运行代码时将image.png替换为您的图像文件路径# 垂直翻转图像
flipped_image = cv2.flip(image, 0)# 水平翻转图像
flipped_image = cv2.flip(image, 1)# 同时水平和垂直翻转图像
flipped_image = cv2.flip(image, -1)# 显示原始图像和翻转后的图像
cv2.imshow('Original', image)              # 显示图像
cv2.imshow('Flipped', flipped_image)
cv2.waitKey(0)                             # 等待用户按下任意键
cv2.destroyAllWindows()                    # 关闭窗口

1.2 图像的仿射变化

cv2.warpAffine()是OpenCV中的一个函数,用于对图像进行仿射变换。仿射变换是一种线性变换,可以用来旋转、平移、缩放和剪切图像。

函数原型如下: dst = cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])

参数解释:

  • src:输入图像。
  • M:仿射变换的3x2变换矩阵。可以通过cv2.getRotationMatrix2D()、cv2.getAffineTransform()等函数获得。
  • dsize:输出图像的大小。
  • dst(可选):输出图像。
  • flags(可选):插值方法的标志。默认值为cv2.INTER_LINEAR,可选的插值方法有:
    • cv2.INTER_NEAREST:最近邻插值。
    • cv2.INTER_LINEAR:双线性插值。
    • cv2.INTER_CUBIC:双三次插值。
    • cv2.INTER_LANCZOS4:Lanczos插值。
  • borderMode(可选):边界填充模式。默认为cv2.BORDER_CONSTANT,可选的边界填充模式有:
    • cv2.BORDER_CONSTANT:边界填充为常数,默认为黑色。
    • cv2.BORDER_REPLICATE:边界复制。
    • cv2.BORDER_REFLECT:边界反射。
    • cv2.BORDER_REFLECT_101:边界反射101。
    • cv2.BORDER_WRAP:边界包裹。
  • borderValue(可选):边界填充的值,当borderMode为cv2.BORDER_CONSTANT时生效。

函数返回值:

  • dst:仿射变换后的图像。

变换矩阵是一个2x3的矩阵,可以通过cv2.getAffineTransform()函数来计算。变换矩阵需要三个点的坐标作为输入,分别是原始图像中的三个点和目标图像中的三个点。

下面是一个使用OpenCV进行仿射变换的示例代码:

import cv2
import numpy as np# 读取图像
img = cv2.imread(image.png')      # 在运行代码时将image.png替换为您的图像文件路径# 原始图像中的三个点
pts1 = np.float32([[50,50], [200,50], [50,200]])# 目标图像中的三个点
pts2 = np.float32([[10,100], [200,50], [100,250]])# 计算变换矩阵
M = cv2.getAffineTransform(pts1, pts2)# 进行仿射变换
dst = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))# 显示结果
cv2.imshow('Original Image', img)     # 名称可修改
cv2.imshow('Transformed Image', dst)     # 名称可修改
cv2.waitKey(0)
cv2.destroyAllWindows()

在上面的代码中,我们首先读取一张图像,然后定义了原始图像中的三个点和目标图像中的三个点。接下来,我们使用cv2.getAffineTransform()函数计算变换矩阵,然后使用cv2.warpAffine()函数进行变换。最后,我们将原始图像和变换后的图像显示出来。

运行上述代码后,你将会看到原始图像和进行了仿射变换后的图像。

1.3 图像的平移

上述中提到,我们可以使用cv2.warpAffine()函数。该函数可以根据指定的平移参数对图像进行平移操作。

以下是一个简单的例子,展示如何使用OpenCV对图像进行平移:

import cv2
import numpy as np# 读取图像
img = cv2.imread('image.jpg')    # 在运行代码时将image.jpg替换为您的图像文件路径# 获取图像的高度和宽度
height, width = img.shape[:2]# 定义平移矩阵
M = np.float32([[1, 0, 100], [0, 1, 50]])# 使用平移矩阵进行图像平移
translated_img = cv2.warpAffine(img, M, (width, height))# 显示原始图像和平移后的图像
cv2.imshow('Original Image', img)
cv2.imshow('Translated Image', translated_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

  

在上述代码中,我们先读取了一张图像,并使用img.shape[:2]获取图像的高度和宽度。然后,我们定义了一个2x3的平移矩阵M,其中M[0,2]表示水平平移量,M[1,2]表示垂直平移量。在本例中,我们将图像向右平移100个像素,向下平移50个像素。

最后,我们使用cv2.warpAffine()函数对图像进行平移操作,传入参数为原始图像、平移矩阵M以及输出图像的大小。平移后得到的图像存储在translated_img变量中,并通过cv2.imshow()函数显示出来。

注意:

平移后的图像可能会超出原始图像的边界,因此可以根据需要调整平移参数以确保图像不被裁剪。

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

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

相关文章

【PyTorch】基础学习:一文详细介绍 torch.load() 的用法和应用

【PyTorch】基础学习:一文详细介绍 torch.load() 的用法和应用 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f44…

UCORE 清华大学os实验 lab0 环境配置

打卡 lab 0 : 环境配置 : 首先在ubt 上的环境,可以用虚拟机或者直接在windows 上面配置 然后需要很多工具 如 qemu gdb cmake git 就是中间犯了错误,误以为下载的安装包,一直解压不掉,结果用gpt 检查 结…

LeetCode 189.轮转数组

题目:给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 思路: 代码: class Solution {public void rotate(int[] nums, int k) {int n nums.length;k k % n;reverse(nums, 0, n);revers…

sqlite 常见命令 表结构

在 SQLite 中,将表结构保存为 SQL 具有一定的便捷性和重要性,原因如下 便捷性: 备份和恢复:将表结构保存为 SQL 可以方便地进行备份。如果需要还原或迁移数据库,只需执行保存的 SQL 脚本,就可以重新创建表…

vulhub中GitLab 任意文件读取漏洞复现(CVE-2016-9086)

GitLab是一款Ruby开发的Git项目管理平台。在8.9版本后添加的“导出、导入项目”功能,因为没有处理好压缩包中的软连接,已登录用户可以利用这个功能读取服务器上的任意文件。 环境运行后,访问http://your-ip:8080即可查看GitLab主页&#xff0…

服务器上很多time_wait是什么意思

在服务器上出现大量的 TIME_WAIT 状态的连接通常是正常的现象,但如果数量过多可能会导致资源浪费和性能问题。TIME_WAIT 状态是指连接已经被关闭,但是套接字还在等待一段时间以确保对方收到了连接关闭的确认消息。以下是关于 TIME_WAIT 状态的解释&#…

设计原则、工厂、单例模式

什么是设计模式 简单来说,设计模式就是很多程序员经过相当长的一段时间的代码实践、踩坑所总结出来的一套解决方案,这个解决方案能让我们少写一些屎山代码,能让我们写出来的代码写出来更加优雅,更加可靠。所以设计模式的好处是显而…

Docker Compose 基本语法

services 是顶级节点,也就是你要启动的服务全部放在这里。 MySOL就是我们预期中的一个服务。 mysql8:指的是我们这个服务叫 mysql8. image:我们这个服务里运行的是什么镜像,或者说跑的是什么。这里指定了使用 mysql:8.0.29 这个版本。 command:启动命令&…

Linux进程管理:(六)SMP负载均衡

文章说明: Linux内核版本:5.0 架构:ARM64 参考资料及图片来源:《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址: zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 1. 前置知识 1.1 CPU管理位图 内核…

深度强化学习01

Random variable Probability Density Function 期望 Random Sampling 学习视频 这绝对是我看过最好的深度强化学习!从入门到实战,7小时内干货不断!_哔哩哔哩_bilibili

智慧城市新篇章:数字孪生的力量与未来

随着信息技术的迅猛发展和数字化浪潮的推进,智慧城市作为现代城市发展的新模式,正在逐步改变我们的生活方式和社会结构。在智慧城市的构建中,数字孪生技术以其独特的优势,为城市的规划、管理、服务等方面带来了革命性的变革。本文…

Mybatis-xml映射文件与动态SQL

xml映射文件 动态SQL <where><if test"name!null">name like concat(%,#{name},%)</if><if test"username!null">and username#{username}</if></where> <!-- collection&#xff1a;遍历的集合--> <!-- …

百科源码生活资讯百科门户类网站百科知识,生活常识

百科源码生活资讯百科门户类网站百科知识,生活常识 百科源码安装环境 支持php5.6&#xff0c;数据库mysql即可&#xff0c;需要有子目录权限&#xff0c;没有权限的话无法安装 百科源码可以创建百科内容&#xff0c;创建活动内容。 包含用户注册&#xff0c;词条创建&#xff…

解决方案:使用Vscode运行命令时,.出现 __vsc_prompt_cmd_original: command not found

参考:https://blog.csdn.net/qq_44949985/article/details/128902944 解决方案&#xff1a;使用Vscode运行命令时,.出现 __vsc_prompt_cmd_original: command not found 问题描述&#xff1a; 在本地的vscode上使用ssh-remote登录到远程服务器&#xff08;操作系统为ubuntu 18.…

Flask学习(四):路由转换器

默认的路由转换器&#xff1a; string &#xff08;缺省值&#xff09; 接受任何不包含斜杠的文本int接受正整数float接受正浮点数 path类似 string&#xff0c;但可以包含斜杠uuid接受 UUID 字符串 代码示例&#xff1a; app.route(/user/<username>) def show_u…

使用Python进行自然语言处理(NLP):NLTK与Spacy的比较【第133篇—NLTK与Spacy】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 使用Python进行自然语言处理&#xff08;NLP&#xff09;&#xff1a;NLTK与Spacy的比较 自…

用尾插的思想实现移除链表中的元素

目录 一、介绍尾插 1.链表为空 2.链表不为空 二、题目介绍 三、思路 四、代码 五、代码解析 1. 2. 3. 4. 5. 6. 六、注意点 1. 2. 一、介绍尾插 整体思路为 1.链表为空 void SLPushBack(SLTNode** pphead, SLTDataType x) {SLTNode* newnode BuyLTNode(x); …

蓝桥杯并查集|路径压缩|合并优化|按秩合并|合根植物(C++)

并查集 并查集是大量的树&#xff08;单个节点也算是树&#xff09;经过合并生成一系列家族森林的过程。 可以合并可以查询的集合的一种算法 可以查询哪个元素属于哪个集合 每个集合也就是每棵树都是由根节点确定&#xff0c;也可以理解为每个家族的族长就是根节点。 元素集合…

UserTCP 传输数据时如何保证数据的可靠性?并以LabVIEW为例进行说明

TCP&#xff08;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议。它通过多种机制保证数据的可靠性&#xff0c;确保数据在网络中从一端传输到另一端时&#xff0c;顺序正确且无误差。以下是TCP实现数据可靠性的一些关键机制&#xff1a; 1. 三…

【开源鸿蒙】模拟运行OpenHarmony轻量系统QEMU RISC-V版

文章目录 一、准备工作1.1 编译输出目录简介 二、QEMU安装2.1 安装依赖2.2 获取源码2.3 编译安装2.4 问题解决 三、用QEMU运行OpenHarmony轻量系统3.1 qemu-run脚本简介3.2 qemu-run脚本参数3.3 qemu-run运行效果3.4 退出QEMU交互模式 四、问题解决五、参考链接 开源鸿蒙坚果派…