(03)python-opencv图像处理——图像的几何变换

news2024/11/28 11:45:06

前言

1、变换

2、缩放

3、平移变换

4、旋转

5、仿射变换

6、翻转

参考文献

前言

在本教程中:

  • 你将会学到将不同的几何变换应用于图像,如平移、旋转、仿射变换等。
  • 你会学到如下函数:cv.getPerspectiveTransform

图像的几何变换是图像处理和图像分析的基础内容之一。图像几何变换又称为图像空间变换, 它将一幅图像中的坐标位置映射到另一幅图像中的新坐标位置。几何变换的特点是改变图像像素的空间位置,而不改变像素灰度值。

图像的几何变换主要包括:

位置变换:图像的平移、镜像、旋转
形状变换:图像的缩放
仿射变换

1、变换

OpenCV 提供了两个变换函数, cv.warpAffine 和 cv.getPerspectiveTransform ,用这两个函数就可以完成所有类型的变换。 cv.warpAffine 输入为 2x3 的变换矩阵, cv.getPerspectiveTransform 输入为 2x3 的变换矩阵。

2、缩放

        缩放是调整图片的大小。 OpenCV 使用 cv.resize() 函数进行调整。可以手动指定图像的大小,也可以指定比例因子。可以使用不同的插值方法。对于下采样(图像上缩小),最合适的插值方法是 cv.INTER_AREA 对于上采样(放大),最好的方法是 cv.INTER_CUBIC (速度较慢)和 cv.INTER_LINEAR (速度较快)。默认情况下,所使用的插值方法都是 cv.INTER_AREA 。你可以使用如下方法调整输入图片大小:

示例如下所示:

import cv2
# 读取图像
image = cv2.imread('images/demo2.png')
# 指定新的宽度和高度,使用 cv.INTER_LINEAR 插值进行放大
new_width = 200
new_height = 200
resized_image_linear = cv2.resize(image, (new_width, new_height), interpolation=cv2.INTER_LINEAR)
# 使用 cv.INTER_CUBIC 插值方法进行放大
resized_image_cubic = cv2.resize(image, (new_width, new_height), interpolation=cv2.INTER_CUBIC)
# 使用比例因子 0.5 对图像进行下采样,使用 cv.INTER_AREA 插值
scale_percent = 50  # 缩小 50%
width = int(image.shape[1] * scale_percent / 100)
height = int(image.shape[0] * scale_percent / 100)
resized_image_area = cv2.resize(image, (width, height), interpolation=cv2.INTER_AREA)
# 显示调整后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Resized Image (Linear)', resized_image_linear)
cv2.imshow('Resized Image (Cubic)', resized_image_cubic)
cv2.imshow('Resized Image (Area)', resized_image_area)
# 等待按键退出
cv2.waitKey(0)
cv2.destroyAllWindows()

 

  • cv2.resize(): 该函数用于缩放图像。你可以指定新尺寸 (new_width, new_height),也可以用比例因子来缩放图像。
  • 插值方法:
    • cv2.INTER_LINEAR: 线性插值,适合放大图像时,速度较快。
    • cv2.INTER_CUBIC: 三次插值,质量较高,适合放大图像时,速度较慢。
    • cv2.INTER_AREA: 像素区域插值,适合下采样(缩小图像时),速度和效果较好。

3、平移变换

平移变换是物体位置的移动。如果知道 (x,y) 方向的偏移量,假设为 (t_x,t_y),则可以创建如下转换矩阵 M

您可以将变换矩阵存为 np.float32 类型的 numpy 数组,并将其作为 cv.warpAffine 的第二个参数。请参见以下转换(100,50)的示例:

import cv2
import numpy as np

# 读取图像
image = cv2.imread('input_image.jpg')

# 图像尺寸
rows, cols = image.shape[:2]

# 定义平移矩阵,移动 100 个像素在 x 方向,50 个像素在 y 方向
M = np.float32([[1, 0, 100], [0, 1, 50]])

# 应用平移
shifted_image = cv2.warpAffine(image, M, (cols, rows))

# 显示原图像和平移后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Shifted Image', shifted_image)

cv2.waitKey(0)
cv2.destroyAllWindows()

 

4、旋转

以 

图片

角度旋转图片的转换矩阵形式为:

图片

但 Opencv 提供了可变旋转中心的比例变换,所以你可以在任意位置旋转图片,修改后的转换矩阵为:

图片

其中:

图片

为了找到这个转换矩阵,opencv 提供了一个函数, cv.getRotationMatrix2D 。请查看下面的示例,它将图像相对于中心旋转 90 度,而不进行任何缩放。

import cv2
import numpy as np
# 读取图像
image = cv2.imread('images/demo2.png')
# 获取图像的尺寸(行数和列数)
rows, cols = image.shape[:2]
# 获取旋转矩阵,旋转中心为图像的中心,旋转角度为 45 度,缩放比例为 1.0
center = (cols / 2, rows / 2)
angle = 45  # 旋转角度
scale = 1.0  # 缩放比例
M = cv2.getRotationMatrix2D(center, angle, scale)
# 使用仿射变换进行旋转,输出图像的尺寸与输入图像相同
rotated_image = cv2.warpAffine(image, M, (cols, rows))
# 显示原图像
cv2.imshow('Original Image', image)
# 显示旋转后的图像
cv2.imshow('Rotated Image', rotated_image)
# 等待用户按键关闭窗口
cv2.waitKey(0)
# 销毁所有窗口
cv2.destroyAllWindows()

5、仿射变换

在仿射变换中,原始图像中的所有平行线在输出图像中仍然是平行的。为了找到变换矩阵,我们需要从输入图像中取三个点及其在输出图像中的对应位置。然后 cv.getPerspectiveTransform 将创建一个 2x3 矩阵,该矩阵将传递给 cv.warpAffine 。

示例

假设我们有一张图像,我们想对其进行仿射变换,比如将图像旋转和缩放。我们将选择三个点,并定义它们在输入图像和输出图像中的对应位置。

import cv2
import numpy as np
# 读取输入图像
image = cv2.imread('images/demo2.png')
# 定义输入图像中的三个点 (x, y) 坐标
points_input = np.float32([[50, 50], [200, 50], [50, 200]])
# 定义输出图像中对应的三个点
points_output = np.float32([[10, 100], [200, 50], [100, 250]])
# 计算仿射变换矩阵
M = cv2.getAffineTransform(points_input, points_output)
# 使用仿射变换矩阵进行变换
rows, cols = image.shape[:2]
warped_image = cv2.warpAffine(image, M, (cols, rows))
# 显示原图像和变换后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Warped Image', warped_image)
# 等待用户按键关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

6、翻转

旋转和翻转的区别:

  • 旋转是指以图形某个点为中心,发生角度的变化。注意在旋转过程中,是图形整体都发生了角度变化,而图形各元素之间的相对位置没有改变

  • 翻转(也叫镜像)是指图形围绕着翻转轴,做空间180°的运动,可知翻转过后得到的图形与原图形关于翻转轴对称

import cv2
# 读取图像
image = cv2.imread('images/demo2.png')
# 翻转图像
# 0 表示围绕 x 轴翻转(垂直翻转)
flipped_image_vertical = cv2.flip(image, 0)
# 1 表示围绕 y 轴翻转(水平翻转)
flipped_image_horizontal = cv2.flip(image, 1)
# -1 表示同时围绕 x 轴和 y 轴翻转
flipped_image_both = cv2.flip(image, -1)
# 显示原图像和翻转后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Flipped Image (Vertical)', flipped_image_vertical)
cv2.imshow('Flipped Image (Horizontal)', flipped_image_horizontal)
cv2.imshow('Flipped Image (Both)', flipped_image_both)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

参考文献

4. 图像处理 - 图像的几何变换 - 《OpenCV 中文文档 4.0.0》 - 书栈网 · BookStack

openCV学习笔记(四)--图像的几何变换Geometric Transformations of Images_opencv translation 理解-CSDN博客

基于OpenCv的图像几何变换-CSDN博客

2、OpenCV 图像的几何变换(Python 接口)_图像几何变换-CSDN博客

2、OpenCV 图像的几何变换(Python 接口)_图像几何变换-CSDN博客

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

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

相关文章

Ping32引领数据防泄漏新潮流:智能、高效、安全

在当今数字化迅猛发展的时代,企业面临着日益严峻的数据安全挑战。数据泄漏事件频发,不仅损害企业声誉,还可能导致巨额的经济损失。为此,Ping32以其创新的数据防泄漏解决方案,正在引领行业新潮流。其技术特点可概括为“…

017 平台属性[属性分组、规格参数、销售属性]

文章目录 获取指定分类的属性列表AttrController.javaAttrServiceImpl.java 获取属性分组所关联的所有属性AttrGroupControllerAttrServiceImpl.java 移除AttrGroupController.javaAttrServiceImpl.javaAttrAttrgroupRelationDao.javaAttrAttrgroupRelationDao.xml 获取属性分组…

动态规划算法专题(六):回文串问题

目录 1、回文子串("引子题") 1.1 算法原理 1.2 算法代码 2、最长回文子串 2.1 算法原理 2.2 算法代码 3、分割回文串 IV(hard) 3.1 算法原理 3.2 算法代码 4、分割字符串 II(hard) 4…

甲虫身体图像分割系统源码&数据集分享

甲虫身体图像分割系统源码&数据集分享 [yolov8-seg-EfficientRepBiPAN&yolov8-seg-C2f-FocusedLinearAttention等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challen…

C语言之扫雷小游戏(完整代码版)

说起扫雷游戏,这应该是很多人童年的回忆吧,中小学电脑课最常玩的必有扫雷游戏,那么大家知道它是如何开发出来的吗,扫雷游戏背后的原理是什么呢?今天就让我们一探究竟! 扫雷游戏介绍 如下图,简…

从0开始linux(12)——命令行参数与环境变量

欢迎来到博主的专栏:从0开始linux 博主ID:代码小豪 文章目录 命令行参数环境变量 我们先打断一下关于进程的话题,博主先来介绍两个东西,分别是命令行参数与环境变量。那么有人看到这就会问了,难道说命令行参数和环境变…

Spring系列 循环依赖

文章目录 注入方式循环依赖的场景单例创建流程getSingletoncreateBeandoCreateBeancreateBeanInstance 循环依赖分析为什么都使用构造函数无法解决?为什么使用Autowired可以解决?为什么要添加到 earlySingletonObjects 缓存中?allowCircularR…

基于Kafka2.1解读Producer原理

文章目录 前言一、Kafka Producer是什么?二、主要组件1.Kafka Producer1.1 partitioner1.2 keySerializer1.3 valueSerializer1.4 accumulator1.5 sender 2.Sender2.1 acks2.2 clientinFlightBatches 3. Selector3.1 nioSelector3.2 channels 4. 全局总览 总结 前言…

【hot100-java】N 皇后

回溯篇 视频题解 真的裂开了&#xff0c;多看视频题解。 class Solution {public List<List<String>> solveNQueens(int n) {List<List<String>>retnew ArrayList<>();int []colnew int[n];boolean[] onPathnew boolean[n];boolean[] diag1ne…

(Linux和数据库)1.Linux操作系统和常用命令

了解Linux操作系统介绍 除了办公和玩游戏之外不用Linux&#xff0c;其他地方都要使用Linux&#xff08;it相关&#xff09; iOS的本质是unix&#xff08;unix是付费版本的操作系统&#xff09; unix和Linux之间很相似 Linux文件系统和目录 bin目录--放工具使用的 操作Linux远程…

双光吊舱图像采集详解!

一、图像采集 可见光图像采集&#xff1a; 使用高性能的可见光相机&#xff0c;通过镜头捕捉自然光或人工光源照射下的目标图像。 相机内部通常配备有先进的图像传感器&#xff0c;如CMOS或CCD&#xff0c;用于将光信号转换为电信号。 红外图像采集&#xff1a; 利用红外热…

【hot100-java】二叉树的最近公共祖先

二叉树篇 我觉得是比两个节点的深度&#xff0c;取min&#xff08;一种情况&#xff09; DFS解题。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val x; }* }*/ clas…

Unity/VS 消除不想要的黄色警告

方法一&#xff1a;单个消除 在要关闭的代码前一行写上#pragma warning disable 警告代码编码 在要关闭代码行下面一行写上#pragma warning restore 警告代码编码 精准的关闭指定地方引起的代码警告&#xff0c;不会过滤掉无辜的代码 #pragma warning disable 0162,1634HandleL…

JDBC: 连接池

文章目录 没有连接池的现状连接池解决现状问题的原理连接池好处常用连接池的介绍Druid连接池DRUID简介Druid常用的配置参数Druid连接池基本使用API介绍 案例代码 没有连接池的现状 通过下图来分析一下我们目前jdbc程序的结构。 以前使用的jdbc的缺点&#xff1a; 1、操作数据库…

户外打气泵方案软件设计开发

随着户外活动的普及和人们对便捷生活的需求&#xff0c;打气泵成为越来越多有车人士及爱好户外运动的人的装备之一。而打气泵的核心控制是它的芯片和软件方案&#xff0c;今天我们就介绍一下打气泵芯片软件方案的开发过程与技术要点。 打气泵方案的软件设计相较于硬件更具复杂性…

数据库——sql多表查询

当要在两个表&#xff08;或多个表&#xff09;中查找对应数据时&#xff0c;与普通的查询略有不同。本篇博文用于介绍基本的多表查询的方法。 为方便展示&#xff0c;本篇建了两个数据库表“学生表”和“班级表”作为例子 其中&#xff0c;在“学生表”中&#xff0c;cid标签…

RT-DETR改进策略:BackBone改进|CAFormer在RT-DETR中的创新应用,显著提升目标检测性能

摘要 在目标检测领域,模型性能的提升一直是研究者和开发者们关注的重点。近期,我们尝试将CAFormer模块引入RT-DETR模型中,以替换其原有的主干网络,这一创新性的改进带来了显著的性能提升。 CAFormer,作为MetaFormer框架下的一个变体,结合了深度可分离卷积和普通自注意力…

SpringBoot教程(二十四) | SpringBoot实现分布式定时任务之Quartz(动态新增、修改等操作)

SpringBoot教程&#xff08;二十四&#xff09; | SpringBoot实现分布式定时任务之Quartz&#xff08;动态新增、修改等操作&#xff09; 前言数据库脚本创建需要被调度的方法创建相关实体类创建业务层接口创建业务层实现类控制层类测试结果 前言 我这边的SpringBoot的版本为2…

Android 防止截屏和录屏

通过给当前的window对象设置标记WindowManager.LayoutParams.FLAG_SECURE来防止截屏和录屏 protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 防止截屏getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManage…

vscode配置:启用括号对着色

想要的效果&#xff1a;启用括号对着色&#xff0c;在大括号之间用折线表示&#xff0c;看起来会更加直观方便&#xff0c;例如在less中嵌套层级比较多时&#xff0c;大括号的层级不容易看清楚&#xff0c;做了这个配置会更好一些。 vscode安装扩展插件&#xff1a;Bracket P…