当前位置: 首页 > news >正文

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

相关文章:

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

文章目录 概要:OpenCV实现图像的几何变换、图像阈值和平滑图像变换小结 概要:OpenCV实现图像的几何变换、图像阈值和平滑图像 使用OpenCV库进行图像处理的三个重要主题:几何变换、图像阈值处理以及图像平滑。在几何变换部分,详细…...

2023MathorCup(妈妈杯) 数学建模挑战赛 解题思路

云顶数模最新解题思路免费分享~~ 2023妈妈杯数学建模A题B题思路,供大家参考~~ A题 B题...

leetCode 76. 最小覆盖子串 + 滑动窗口 + 哈希Hash

我的往期文章:此题的其他解法,感兴趣的话可以移步看一下: leetCode 76. 最小覆盖子串 滑动窗口 图解(详细)-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/134042115?spm1001.2014.3001.5501 力…...

52.MongoDB复制(副本)集实战及其原理分析

MongoDB复制集架构 高可用 在生产环境中,不建议使用单机版的MongoDB服务器。 Mongodb复制集(Replication Set)由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Dr…...

【Unity实战】手戳一个自定义角色换装系统——2d3d通用

文章目录 每篇一句前言素材开始切换头型添加更改颜色随机控制头型和颜色新增眼睛同样的方法配置人物的其他部位设置相同颜色部位全部部位随机绘制UI并添加点击事件通过代码控制点击事件添加颜色修改的事件其他部位效果UI切换添加随机按钮保存角色变更数据跳转场景显示角色数据 …...

ruoyi-nbcio版本从RuoYi-Flowable-Plus迁移过程记录

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 从KonBAI / RuoYi-Flowable-Plus 项目移植过来,开始用yarn install之后yarn run dev 还是有问…...

竞赛 深度学习卷积神经网络垃圾分类系统 - 深度学习 神经网络 图像识别 垃圾分类 算法 小程序

文章目录 0 简介1 背景意义2 数据集3 数据探索4 数据增广(数据集补充)5 垃圾图像分类5.1 迁移学习5.1.1 什么是迁移学习?5.1.2 为什么要迁移学习? 5.2 模型选择5.3 训练环境5.3.1 硬件配置5.3.2 软件配置 5.4 训练过程5.5 模型分类效果(PC端) 6 构建垃圾…...

Linux音频-基本概念

文章目录 机器声音的采集原理机器声音的播放原理音频相关基本概念计算机采集音频的模型Linux系统音频框架Linux音频框架的三类角色 Linux音频框架参考文章:Linux音频框架 机器声音的采集原理 声音是一种连续的信号,故其是一种模拟量。 录音设备可以捕获…...

Spring Boot 依赖注入实现原理

Spring Boot 是 Spring 框架的扩展,它简化了 Spring 应用程序的创建和部署。在 Spring Boot 中,依赖注入是实现对象间解耦的重要技术,它使得应用程序的各个组件之间可以通过依赖注入来相互协作,提高了代码的可维护性和可重用性。 …...

cola架构:cola源码中访问者模式应用浅析

目录 1.访问者模式简介 2.cola访问者模式应用 2.1 cola被访问者类图 2.2 cola访问者类图 我们知道,如果一个对象结构包含很多类型的对象,希望对这些对象实施一些依赖其具体类型的操作,但又避免让这些操作“污染”这些对象的类&#xff0c…...

Openssl数据安全传输平台015:OCCI的使用方法+在项目中的设计与实现

文章目录 1 OCCI使用1.1 初始化 - Environment 类1.2 连接数据库 - Connection 类1.3 执行SQL 2 OCCI在项目中的使用2.1 OCCI单独封装为一个类文件OCCIOP2.2 在ServerOP中作为私有成员2.3 ServerOP::ServerOP(string json)中实例化进行使用2.4 秘钥协商过程中进行读写操作 1 OC…...

ardupilot开发 --- CAN BUS、DroneCAN 、UAVCAN 篇

1. CAN BUS、DroneCAN 、UAVCAN 区别 UAVCAN是一种轻量级协议,旨在通过CAN BUS 在航空航天和机器人应用中实现可靠通信。 UAVCAN网络是分散的对等网络,其中每个对等体(节点)具有唯一的数字标识符 - 节点ID,并且仅需要…...

京东平台数据分析:2023年9月京东空气净化器行业品牌销售排行榜

鲸参谋监测的京东平台9月份空气净化器市场销售数据已出炉! 9月份,空气净化器的销售同比上年增长。根据鲸参谋平台的数据显示,今年9月,京东平台空气净化器的销量将近15万,同比增长约1%;销售额将近2亿元&…...

vue使日历组件点击时间渲染到时间输入框

首先,你需要在 Vue 中创建一个日历组件,该组件应该能够显示一个月的日历并允许用户选择日期。然后,当用户点击一个日期时,你需要将所选日期的值传递给父组件。最后,你可以在父组件中创建一个时间输入框,当用…...

TensorFlow学习:使用官方模型和自己的训练数据进行图片分类

前言 教程来源:清华大佬重讲机器视觉!TensorFlowOpencv:深度学习机器视觉图像处理实战教程,物体检测/缺陷检测/图像识别 注: 这个教程与官网教程有些区别,教程里的api比较旧,核心思想是没有变…...

MATLAB算法实战应用案例精讲-【图像处理】相机标定

目录 知识储备 距离算法和相似度计算方法 1、常见的距离算法 2、常见的相似度(系...

python画气泡标尺图

目录 渐变气泡图彩色气泡图 在进行实验结果分析的时候,气泡标尺图能非常清晰对不同的结果进行多维度的比较,特别是在深度学习模型大小和精度进行比较的时候非常合适使用,以下是几个例子。 渐变气泡图 import seaborn as sns import matplotl…...

Java并发编程指南:如何正确使用信号量和线程池熔断机制

前言: 在分布式系统中,选择合适的熔断机制是保护系统免受故障影响的关键。本文将介绍使用信号量和线程池两种常见的熔断机制,并提供Java和Spring Cloud Alibaba框架下的示例代码,帮助您深入理解和应用。 1. 信号量熔断机制 信号…...

大彩串口屏读写文件问题

分区 本文使用的是大彩串口屏M系列的: 串口屏内部有三个分区,分别为A、B、C三个区: A区:系统区,存储组态工程文件 B区:数据区,存储配置信息,记录数据、历史曲线等 C区:备…...

php之 角色的权限管理(RBAC)详解

RBAC(Role-based access control)是一种常见的权限管理模型,通过将用户分配至特定的角色,以及为角色分配访问权限,实现了权限管理的目的。以下是关于RBAC的详细解释: 角色:RBAC模型的核心是角色…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…...

针对药品仓库的效期管理问题,如何利用WMS系统“破局”

案例&#xff1a; 某医药分销企业&#xff0c;主要经营各类药品的批发与零售。由于药品的特殊性&#xff0c;效期管理至关重要&#xff0c;但该企业一直面临效期问题的困扰。在未使用WMS系统之前&#xff0c;其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...

2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案

一、延迟敏感行业面临的DDoS攻击新挑战 2025年&#xff0c;金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征&#xff1a; AI驱动的自适应攻击&#xff1a;攻击流量模拟真实用户行为&#xff0c;差异率低至0.5%&#xff0c;传统规则引…...

41道Django高频题整理(附答案背诵版)

解释一下 Django 和 Tornado 的关系&#xff1f; Django和Tornado都是Python的web框架&#xff0c;但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架&#xff0c;鼓励快速开发和干净、实用的设计。它遵循MVC设计&#xff0c;并强调代码复用。Django有…...

EEG-fNIRS联合成像在跨频率耦合研究中的创新应用

摘要 神经影像技术对医学科学产生了深远的影响&#xff0c;推动了许多神经系统疾病研究的进展并改善了其诊断方法。在此背景下&#xff0c;基于神经血管耦合现象的多模态神经影像方法&#xff0c;通过融合各自优势来提供有关大脑皮层神经活动的互补信息。在这里&#xff0c;本研…...