【OpenCV实现图像的几何变换】

文章目录

    • 概要:OpenCV实现图像的几何变换、图像阈值和平滑图像
    • 变换
    • 小结

概要:OpenCV实现图像的几何变换、图像阈值和平滑图像

使用OpenCV库进行图像处理的三个重要主题:几何变换、图像阈值处理以及图像平滑。在几何变换部分,详细介绍了图像的平移、旋转、缩放和仿射变换,以及如何利用OpenCV的函数实现这些操作。接着图像阈值处理的概念和方法,包括简单阈值、自适应阈值和大津阈值等。最后,图像平滑的技术,包括均值滤波、高斯滤波和中值滤波,以及它们在去噪和模糊处理中的应用。

主要内容:

几何变换:图像平移:介绍了如何通过OpenCV的cv2.warpAffine()函数实现图像的平移操作。图像旋转:演示了如何使用OpenCV的cv2.getRotationMatrix2D()和cv2.warpAffine()函数实现图像的旋转。图像缩放:介绍了图像缩小和放大的概念,以及如何使用OpenCV的cv2.resize()函数实现缩放。仿射变换:探讨了仿射变换的定义和实现,包括变换矩阵的计算和应用。图像阈值处理:简单阈值:介绍了简单阈值处理的基本原理和OpenCV函数cv2.threshold()的使用方法。自适应阈值:讨论了自适应阈值处理的概念,以及OpenCV中的cv2.adaptiveThreshold()函数的用法。大津阈值:介绍了大津阈值法的原理,以及如何使用OpenCV的cv2.threshold()函数结合cv2.THRESH_OTSU标志实现自动阈值选择。图像平滑:均值滤波:详细介绍了均值滤波的概念和OpenCV中的cv2.blur()函数的应用。高斯滤波:探讨了高斯滤波的原理和OpenCV函数cv2.GaussianBlur()的使用方法。中值滤波:介绍了中值滤波的特点,以及如何使用OpenCV的cv2.medianBlur()函数实现中值滤波。

变换

图像应用不同的几何变换,就像平移、旋转、仿射变换
函数:cv.getPerspectiveTransform

1.缩放
OpenCV提供了两个主要的图像变换函数:cv.warpAffine和cv.warpPerspective,用于完成各种类型的图像变换。cv.warpAffine输出一个2×3的变换矩阵,而cv.warpPerspective输出一个3×3的变换矩阵。

在图像处理中,缩放是一种常见的操作,它可以重新调整图像的尺寸。OpenCV提供了cv.resize()函数,可以手动设置图像的大小或者使用比例因子进行缩放。在缩放过程中,你可以选择不同的插值方法。通常,cv.INTER_AREA用于缩小图像,而cv.INTER_CUBIC(速度较慢)和cv.INTER_LINEAR用于放大图像。其中,cv.INTER_LINEAR插值方法可以适用于各种缩放场景。

以下是两种调整输入图像大小的方法:

import numpy as np
import cv2 as cvimg = cv.imread('img.png')# 方法一:使用fx和fy作为比例因子进行缩放
res = cv.resize(img, None, fx=2, fy=2, interpolation=cv.INTER_CUBIC)# 方法二:手动设置新的图像大小进行缩放
height, width = img.shape[:2]
res = cv.resize(img, (2 * width, 2 * height), interpolation=cv.INTER_CUBIC)
cv.namedWindow('Resized Image', cv.WINDOW_NORMAL)  # 定义窗口,可以调整窗口大小
cv.imshow('Resized Image', res)  # 在窗口中显示图像cv.waitKey(0)  # 等待用户按下任意键
cv.destroyAllWindows()  # 关闭窗口

结果:
在这里插入图片描述
2.平移
平移是指在图像上进行位置的移动操作。如果你知道当前位置 (x,y)(x,y) 和目标位置 (tx,ty)(tx​,ty​),你可以创建一个仿射变换矩阵 MM,如下所示:
在这里插入图片描述

你可以使用Numpy库中的np.float32数据类型创建这个矩阵,并将其传递给OpenCV的cv.warpAffine()函数,以便进行平移操作。在这个矩阵中,txtx​ 表示在x轴上的平移量,tyty​ 表示在y轴上的平移量。通过这个变换矩阵,你可以将图像平移到新的位置。

import numpy as np
import cv2 as cv# 读取灰度图像
img = cv.imread('img.png', 0)
rows, cols = img.shape# 定义平移矩阵
M = np.float32([[1, 0, 100],  # x轴平移100个像素[0, 1, 50]    # y轴平移50个像素
])# 应用平移变换
dst = cv.warpAffine(img, M, (cols, rows))# 显示平移后的图像
cv.imshow('img', dst)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述
3.旋转
实现图像的旋转操作。通常,旋转操作需要一个旋转角度(θ),以及旋转的中心点。OpenCV提供了一个函数cv.getRotationMatrix2D来帮助你计算旋转矩阵。该函数采用以下参数:
旋转中心点的坐标 (center_x, center_y)
旋转角度 θ
缩放因子 scale
使用这些参数,函数将返回一个变换矩阵,可以将其传递给cv.warpAffine()函数来实现图像的旋转。

import numpy as np
import cv2 as cv# 读取灰度图像
img = cv.imread('img.png', 0)# 获取图像的高度和宽度
rows, cols = img.shape# 计算旋转中心点的坐标,90 是旋转的角度,1 是缩放因子(不缩放)
center_x = (cols - 1) / 2.0
center_y = (rows - 1) / 2.0# 获取旋转矩阵,参数分别是旋转中心坐标,旋转角度,缩放因子
M = cv.getRotationMatrix2D((center_x, center_y), 180, 1)# 应用仿射变换,将图像旋转90度
dst = cv.warpAffine(img, M, (cols, rows))
# 显示平移后的图像
cv.imshow('img', dst)
cv.waitKey(0)
cv.destroyAllWindows()

fe2.png)
4.仿射变换

是一种保持图像中的平行线依旧平行的线性变换。在进行仿射变换时,我们需要在原图像中选择三个非共线的点和它们在输出图像中对应的位置。这三个点将确定一个仿射变换矩阵,该矩阵可以用于将原图像中的任意点映射到输出图像中的对应点。OpenCV提供了函数cv.getAffineTransform用于计算仿射变换矩阵。

以下是一个示例,演示了如何使用cv.getAffineTransform函数进行仿射变换:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt# 读取输入图像
img = cv.imread('drawing.png')
rows, cols, ch = img.shape# 原图像中的三个点和它们在输出图像中的对应位置
pts1 = np.float32([[50, 50], [200, 50], [20, 200]])
pts2 = np.float32([[10, 100], [200, 50], [100, 250]])# 计算仿射变换矩阵
M = cv.getAffineTransform(pts1, pts2)# 应用仿射变换
dst = cv.warpAffine(img, M, (cols, rows))# 显示输入图像和输出图像
plt.subplot(121), plt.imshow(img), plt.title("Input")
plt.subplot(122), plt.imshow(dst), plt.title("Output")
plt.show()

在这个例子中,pts1是原图像中的三个点,pts2是它们在输出图像中的对应位置。函数cv.getAffineTransform计算了仿射变换矩阵M,然后cv.warpAffine函数将该矩阵应用到原图像上,得到输出图像dst。左边的图是输入图像,右边的图是输出图像。
在这里插入图片描述
5.透视变换
透视变换是一种将图像中的任意四边形区域转换为另一个四边形区域的线性变换。在透视变换中,我们需要一个 3 × 3 的矩阵,这个矩阵可以将原图像中的任意点映射到输出图像中的对应点。为了找到这个变换矩阵,我们需要在输入图像和输出图像中选择四个对应的点,这四个点中至少有三个不能共线。使用函数 cv.getPerspectiveTransform 可以计算这个透视变换矩阵,然后将其传递给 cv.warpPerspective 函数应用变换。

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt# 读取输入图像
img = cv.imread('sudoku.png')
rows, cols, ch = img.shape# 原图像中的四个点和它们在输出图像中的对应位置
pts1 = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]])
pts2 = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]])# 计算透视变换矩阵
M = cv.getPerspectiveTransform(pts1, pts2)# 应用透视变换
dst = cv.warpPerspective(img, M, (300, 300))# 显示输入图像和输出图像
plt.subplot(121), plt.imshow(img), plt.title('Input')
plt.subplot(122), plt.imshow(dst), plt.title('Output')
plt.show()

在这个例子中,pts1 是原图像中的四个点,pts2 是它们在输出图像中的对应位置。函数 cv.getPerspectiveTransform 计算了透视变换矩阵 M,然后 cv.warpPerspective 函数将该矩阵应用到原图像上,得到输出图像 dst。左边的图是输入图像,右边的图是输出图像。
在这里插入图片描述

小结

掌握使用OpenCV库进行图像几何变换、阈值处理和平滑处理的关键技能。这些技术在图像处理、计算机视觉和图像分析等领域中具有广泛的应用,对于处理各种图像数据具有重要意义,可以应用到更复杂的图像处理任务中。

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

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

相关文章

【Linux精讲系列】——yum软件包管理

​作者主页 📚lovewold少个r博客主页 ⚠️本文重点:Linux系统软件包管理工具yum讲解 😄每日一言:踏向彼岸的每一步,都是到达彼岸本身。 目录 前言 Linux系统下的软件下载方式 yum 查看软件包 如何安装软件 如何卸…

myTracks for Mac:GPS轨迹记录器的强大与便捷

你是否曾经在户外活动或旅行中,希望能够记录下你的移动轨迹?或者在工作中,需要跟踪你的行程路线?myTracks for Mac 是一款强大的 GPS 轨迹记录器,它可以帮助你实现这些愿望。 myTracks 是一款专门为 Mac 设计的 GPS 轨…

微信JSAPI支付对接

简介 JSAPI支付是指商户通过调用微信支付提供的JSAPI接口,在支付场景中调起微信支付模块完成收款。 应用场景 JSAPI支付适用于线下场所、公众号场景和PC网站场景。 商户已有H5商城网站,用户通过消息或扫描二维码在微信内打开网页时,可以调…

机器学习-学习率:从理论到实战,探索学习率的调整策略

目录 一、引言二、学习率基础定义与解释学习率与梯度下降学习率对模型性能的影响 三、学习率调整策略常量学习率时间衰减自适应学习率AdaGradRMSpropAdam 四、学习率的代码实战环境设置数据和模型常量学习率时间衰减Adam优化器 五、学习率的最佳实践学习率范围测试循环学习率&a…

【spark客户端】Spark SQL CLI详解:怎么执行sql文件、注释怎么写,支持的文件路径协议、交互式模式使用细节

文章目录 一. Spark SQL Command Line Options(命令行参数)二. The hiverc File1. without the -i2. .hiverc 介绍 三. 支持的路径协议四. 支持的注释类型五. Spark SQL CLI交互式命令六. Examples1. running a query from the command line2. setting Hive configuration vari…

缓解光纤激光切割机老化之如何保养光纤激光切割机的光学镜片

激光切割头具备极高的精密度和昂贵的价格,是光纤激光切割机最关键的运行部分之一。在日常的光纤激光切割机维修过程中频繁出现的关于切割头使用寿命的问题就是内部光学镜片的污染及损坏。 部分导致光纤激光切割机激光切割头光学镜片污染的原因主要包括:对…

【APP VTable】和市面上的 Table 组件一样,都是接收表格[] 以及数据源[]

博主&#xff1a;_LJaXi Or 東方幻想郷 专栏&#xff1a; uni-app | 小程序开发 开发工具&#xff1a;HBuilderX 这里写目录标题 表格组件USE 表格组件 <template><view class"scroll-table-wrapper"><view class"scroll-table-container"…

iOS安全加固方法及实现

​ 目录 iOS安全加固方法及实现 摘要 引言 iOS安全加固方法及实现 一、字符串加密 二、类名方法名混淆 三、程序代码混淆 四、加入安全SDK 总结 参考资料 摘要 本文介绍了iOS平台下的应用安全保护方法&#xff0c;包括字符串加密、类名方法名混淆、程序代码混淆和加入…

杂牌行车记录仪特殊AVI结构恢复案例

最近遇到一个杂牌的行车记录仪需要恢复数据&#xff0c;其使用AVI格式&#xff0c;但是在扫描恢复的过程中却发现厂家对其AVI结构进行了“魔改”致程序无法正常识别 故障存储:16G SD卡 fat32文件系统 故障现象: 16G的SD卡&#xff0c;在发生事故后客户尝试自行接到手机上读…

项目进度延误,危机管理5大注意事项

项目延误危机管理的重要性是不可忽视的。项目延误可能会导致资源浪费、成本增加、客户不满、信誉受损等一系列问题&#xff0c;严重影响项目的成功与效益。因此&#xff0c;有效地进行项目延误危机管理是至关重要的&#xff0c;一般主要是从以下5个方面进行管理&#xff1a; 1、…

《动手学深度学习 Pytorch版》 10.6 自注意力和位置编码

在注意力机制中&#xff0c;每个查询都会关注所有的键&#xff0d;值对并生成一个注意力输出。由于查询、键和值来自同一组输入&#xff0c;因此被称为 自注意力&#xff08;self-attention&#xff09;&#xff0c;也被称为内部注意力&#xff08;intra-attention&#xff09;…

竞赛 深度学习人体跌倒检测 -yolo 机器视觉 opencv python

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满…

npm改变npm缓存路径和改变环境变量

在安装nodejs时&#xff0c;系统会自动安装在系统盘C&#xff0c; 时间久了经常会遇到C盘爆满&#xff0c;有时候出现红色&#xff0c;此时才发现很多时候是因为npm 缓存保存在C盘导致的&#xff0c;下面就介绍下如何改变npm缓存路径。 1、首先找到安装nodejs的路径&#xff0c…

JVM(Java Virtual Machine)G1收集器篇

前言 本文参考《深入理解Java虚拟机》&#xff0c;本文主要介绍G1收集器的收集思想和具体过程&#xff08;填上一篇文章留下的坑&#xff09; 本系列其他文章链接&#xff1a; JVM&#xff08;Java Virtual Machine&#xff09;内存模型篇 JVM&#xff08;Java Virtual Machi…

SQL sever中函数(2)

目录 一、函数分类及应用 1.1标量函数&#xff08;Scalar Functions&#xff09;&#xff1a; 1.1.1格式 1.1.2示例 1.1.3作用 1.2表值函数&#xff08;Table-Valued Functions&#xff09;&#xff1a; 1.2.1内联表值函数&#xff08;Inline Table-Valued Functions&am…

Linux shell编程学习笔记15:定义数组、获取数组元素值和长度

一、 Linux shell 脚本编程中的数组概述 数组是一种常见的数据结构。跟大多数编程语言一样&#xff0c;大多数Linux shell脚本支持数组&#xff0c;但对数组的支持程度各不相同&#xff0c;比如数组的维度&#xff0c;是支持一维数组还是多维数组&#xff1f;再如&#xff0c;…

Redis为什么变慢了

一、Redis为什么变慢了 1.Redis真的变慢了吗? 对 Redis 进行基准性能测试 例如,我的机器配置比较低,当延迟为 2ms 时,我就认为 Redis 变慢了,但是如果你的硬件配置比较高,那么在你的运行环境下,可能延迟是 0.5ms 时就可以认为 Redis 变慢了。 所以,你只有了解了你的…

蓝桥杯每日一题2023.10.27

题目描述 快速排序 - 蓝桥云课 (lanqiao.cn) #include <stdio.h>int quick_select(int a[], int l, int r, int k) {int p rand() % (r - l 1) l;int x a[p];{int t a[p]; a[p] a[r]; a[r] t;}int i l, j r;while(i < j) {while(i < j && a[i] &…

Python轮廓追踪【OpenCV形态学操作】

文章目录 概要代码运行结果 概要 一些理论知识 OpenCV形态学操作理论1 OpenCV形态学操作理论2 OpenCV轮廓操作|轮廓类似详解 代码 代码如下&#xff0c;可以直接运行 import cv2 as cv# 定义结构元素 kernel cv.getStructuringElement(cv.MORPH_RECT, (3, 3)) # print kern…