【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.hqwc.cn/news/150864.html

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

相关文章

华为eNSP配置专题-策略路由的配置

文章目录 华为eNSP配置专题-策略路由的配置0、概要介绍1、前置环境1.1、宿主机1.2、eNSP模拟器 2、基本环境搭建2.1、终端构成和连接2.2、终端的基本配置 3、配置接入交换机上的VLAN4、配置核心交换机为网关和DHCP服务器5、配置核心交换机和出口路由器互通6、配置PC和出口路由器…

16结构型模式-组合模式

我们很容易将“组合模式”和“组合关系”搞混。组合模式最初只是用于解决树形结构的场景,更多的是处理对象组织结构之间的问题。而组合关系则是通过将不同对象封装起来完成一个统一功能. 1 组合模式介绍 将对象组合成树形结构以表示整个部分的层次结构.组合模式可…

toluaframework中C#怎么调用Lua的方法以及无GC方法

toluaframework中C#怎么调用Lua的方法 问题Util.CallMethodLuaManager.CallFunctionLuaFunction.LazyCall 解决方案LuaFunction脚本无GC消耗的调用 用法总结 问题 用过luaframework框架的人应该都知道框架提供了Util的工具类,工具类提供了一个方法就是Util.CallMet…

【SOPHON】算能盒子SE-16的C++模型转换

目录 ONNX转MLIR指定模型的预处理过程转换结果 本文以 arcface 为例, 介绍如何编译迁移一个onnx模型至TPU平台运行。 有疑问具体可参考 TPU-MLIR ONNX转MLIR 如果模型是图片输入, 在转模型之前我们需要了解模型的预处理。如果模型用预处理后的npz文件做输入, 则不需要考虑预处…

RabbitMQ初入门

1、RabbitMQ是什么 RabbitMQ是“实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均…

创纪录的1亿RPS DDoS攻击利用HTTP/2快速重置漏洞

导语:最近,一项创纪录的DDoS攻击引起了广泛关注。攻击者利用了HTTP/2协议中的一个快速重置漏洞,发起了一系列超大规模的攻击。本文将为大家详细介绍这次攻击的背景、影响以及应对措施。 攻击背景 最近,全球范围内遭受了一系列规模…

Java提升技术,进阶为高级开发和架构师的路线

原文网址:Java提升技术,进阶为高级开发和架构师的路线-CSDN博客 简介 Java怎样提升技术?怎样进阶为高级开发和架构师?本文介绍靠谱的成长路线。 首先点明,只写业务代码是无法成长技术的。提升技术的两个方法是&…

「林曦的亲子美育」讲讲关于阅读的那些事儿

「林曦的亲子美育」是“林曦的小世界”2023年策划的一档新栏目。林曦老师作为一个“小男生的妈妈”,在这些年分享了许多关于亲子教育的心得:以“美”作为连接和最高标准,会护持着小朋友的选择和人生。教育是一个生活的过程。做一餐饭、读一本书、看一张画…

网盘限速问题解析:哪家网盘真的不限速?

天下苦网盘限速久矣。市面上一些网盘工具要不然是收费限流,要不然是需要额外购买下载券。哪家网盘真的不限速? Zoho Workdrive 企业网盘是真正的不限速网盘,上传和下载文件都不限速,真正做到用户的网速有多快,下载就有…

YOLOv7优化:渐近特征金字塔网络(AFPN)| 助力小目标检测

💡💡💡本文改进:渐近特征金字塔网络(AFPN),解决多尺度削弱了非相邻 Level 的融合效果。 AFPN | 亲测在多个数据集能够实现涨点,尤其在小目标数据集。 收录: YOLOv7高阶自研专栏介绍: http://t.csdnimg.cn/tYI0c ✨✨✨前沿最新计算机顶会复现 🚀🚀🚀…

多线程---线程安全问题及解决

文章目录 一个线程不安全的案例造成线程不安全的原因抢占式执行多个线程修改同一个变量修改操作不是原子的内存可见性问题指令重排序问题 如何让线程变得安全?加锁volatile 一个线程不安全的案例 题目:有较短时间让变量count从0加到10_0000 解决方案&a…

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

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