【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.rhkb.cn/news/170859.html

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

相关文章

uniapp vue2、vue3 页面模板代码块设置

本文分享 uniapp vue2、vue3 页面模板代码块设置 设置路径 HBuilder X -> 工具 -> 代码块设置 -> vue代码块 -> 自定义代码块 如上图操作后在打开的 vue.json 文件的右侧“自定义代码块”中复制如下代码(可全选替换也可添加到代码中) 示…

vue+iView 动态侧边栏菜单保持高亮选中

iview 组件在使用过程中,多多少少有一些小坑,本文简单罗列一二: 避坑指南: 关于iview 侧边栏菜单未能展开高亮选中回显问题 应用场景:iview-admin下接入动态菜单后,刷新或链接跳入时回显失效 简单就是两个方…

Jenkins 重新定义 pom 内容,打包

文章目录 源码管理构建 源码管理 添加仓库地址,拉取凭证,选择需要的分支 构建 勾选 构建环境 下删除原始 build 配置,防止文件错误 Pre Steps 构建前处理 pom.xml ,例如我是需要删除该模块的所有子模块配置,我这里…

【计算机毕设小程序案例】基于SpringBoot的小演员招募小程序

前言:我是IT源码社,从事计算机开发行业数年,专注Java领域,专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务 👉IT源码社-SpringBoot优质案例推荐👈 👉IT源码社-小程序优质案例…

java-- 静态数组

1.静态初始化数组 定义数组的时候直接给数组赋值。 2.静态初始化数组的格式: 注意: 1."数据类型[] 数组名"也可以写成"数据类型 数组名[]"。 2.什么类型的数组只能存放什么类型的数据 3.数组在计算机中的基本原理 当计算机遇到…

Redis 配置文件(redis.conf)中文注释及说明

文章目录 一、概述二、觉见基础配置1.1 导入另一个配置文件1.2 添加Redis扩展1.3 绑定Redis服务在那些网卡上,也就是远程可以通过那个的IP地址访问。1.2 指定Redis服务监听端口1.2 最大分配内容大小1.2 后台服务方式运行1.2 日志记录文件1.2 添加扩展 三、完整配置文…

【EI会议征稿】 2024年遥感、测绘与图像处理国际学术会议(RSMIP2024)

2024年遥感、测绘与图像处理国际学术会议(RSMIP2024) 2024 International Conference on Remote Sensing, Mapping and Image Processing 2024年遥感、测绘与图像处理国际学术会议(RSMIP2024)将于2024年1月19日-21日在中国厦门举行。会议主要围绕遥感、测绘与图像处理等研究领…

为什么进行压力测试? 有哪些方法?

在信息技术飞速发展的今天,软件系统的性能已经成为了用户满意度的决定性因素之一。而要确保一个系统在实际使用中能够稳定可靠地运行,压力测试就显得尤为关键。本文将深入探讨什么是压力测试,为什么它是如此重要,以及一些常见的压…

Python深度学习实战-基于tensorflow.keras六步法搭建神经网络(附源码和实现效果)

实现功能 第一步:import tensorflow as tf:导入模块 第二步:制定输入网络的训练集和测试集 第三步:tf.keras.models.Sequential():搭建网络结构 第四步:model.compile():配置训练方法 第五…

k8s-----24、亲和力Affinity

1、应用场景 pod和节点间的关系: 某些Pod优先选择有ssdtrue标签的节点,如果没有在考虑部署到其它节点;某些Pod需要部署在ssdtrue和typephysical的节点上,但是优先部署在ssdtrue的节点上; pod和pod间的关系: 同一个应用的Pod不…

【软件安装】Windows系统中使用miniserve搭建一个文件服务器

这篇文章,主要介绍如何在Windows系统中使用miniserve搭建一个文件服务器。 目录 一、搭建文件服务器 1.1、下载miniserve 1.2、启动miniserve服务 1.3、指定根目录 1.4、开启访问日志 1.5、指定启动端口 1.6、设置用户认证 1.7、设置界面主题 (…

大数据-Storm流式框架(二)--wordcount案例

一、编写wordcount案例 1、新建java项目 2、添加storm的jar包 storm软件包中lib目录下的所有jar包 3、编写java类 WordCountTopology.java package com.bjsxt.storm.wc;import backtype.storm.Config; import backtype.storm.LocalCluster; import backtype.storm.genera…

华为数通方向HCIP-DataCom H12-831题库(多选题:61-80)

第61题 在MPLS VPN中,为了区分使用相同地址空间的IPV4前缀,将IPV4的地址增加了RD值,下列选项描述正确的是: A、在PE设备上,每一个VPN实例都对应一个RD值,同一PE设备上,必须保证RD值唯一 B、RD可用于来控制VPN路由信息的发布 C、RD在传递过程中作为BGP的扩展团体性封装在…

Vuex 动态模块状态管理器

模块化思想 我们之前的博文已经讲述了Vuex怎么使用命名空间实现模块化状态管理。详情可以看: Vuex命名空间及如何获取根模块、兄弟模块状态管理器_AI3D_WebEngineer的博客-CSDN博客https://blog.csdn.net/weixin_42274805/article/details/133269196?ops_request_…

Python-自动化绘制股票价格通道线

常规方案 通过将高点/低点与其 2 个或 3 个相邻点进行比较来检测枢轴点,并检查它是否是其中的最高/最低点。对所有枢轴点进行线性回归以获得上方和下方趋势线。价格离开通道后建仓。通过这样做,我们得到如下所示的价格通道。我认为我们可以利用给定的数据取得更好的结果。

【数据结构】数组和字符串(五):特殊矩阵的压缩存储:稀疏矩阵——压缩稀疏行(CSR)

文章目录 4.2.1 矩阵的数组表示4.2.2 特殊矩阵的压缩存储a. 对角矩阵的压缩存储b~c. 三角、对称矩阵的压缩存储d. 稀疏矩阵的压缩存储——三元组表e. 压缩稀疏行(Compressed Sparse Row,CSR)矩阵结构体创建CSR矩阵元素设置初始化打印矩阵销毁…

22 行为型模式-状态模式

1 状态模式介绍 2 状态模式结构 3 状态模式实现 代码示例 //抽象状态接口 public interface State {//声明抽象方法,不同具体状态类可以有不同实现void handle(Context context); }

Jmeter(十六):jmeter场景的运行架构配置远程负载机详解

jmeter场景的运行架构(本地运行和远程运行) 运行方式: GUI运行:通过图形界面方式运行,该运行方式的可视化界面及监听器动态展示 结果都比较消耗负载机资源,建议大并发时不用,一般进行脚本调试; 命令行运行…

软考系统架构师知识点集锦二:软件工程

一、考情分析 二、考点精讲 2.1 软件过程模型 (1)原型模型 典型的原型开发方法模型。适用于需求不明确的场景,可以帮助用户明确需求。可以分为[抛弃型原型]与[演化型原型] 原型模型两个阶段: 1、原型开发阶段;2、目标软件开发阶段。 &#x…

世界经济论坛:ChatGPT等生成式AI,对全球23%岗位产生巨大影响

世界经济论坛与全球最大上市咨询公司之一埃森哲合作,联合发布了《未来工作:大语言模型与就业》白皮书。 世界经济论坛表示,随着ChatGPT、Midjourney、Github Copilot等生成式AI的飞速发展,对全球经济和劳动市场产生巨大影响。未来…