OpenCV||超详细的几何变换

news2024/9/21 2:47:20

2D图像几何变换的3×3矩阵:

图像常见的几何变换:

 图像来源:《OpenCV 4.5计算机视觉开发实战:基于Python》作者:朱文伟 李建英;

1. 平移(Translation)

在OpenCV中,平移不是直接通过一个函数完成的,而是先通过创建一个平移矩阵,然后使用warpAffine函数应用这个矩阵。

cv2.getTranslationMatrix2D(center, offset, scale)

  • center:源图像中的变换中心。
  • offset:沿x和y方向移动的距离。
  • scale:通常设置为1.0,因为平移不涉及缩放。

返回的矩阵然后传递给warpAffine函数进行实际的平移操作。

2. 旋转(Rotation)

cv2.getRotationMatrix2D(center, angle, scale)

  • center:旋转中心。
  • angle:旋转角度,以度为单位。正值表示逆时针旋转。
  • scale:图像缩放比例。

这个函数返回一个2x3的旋转矩阵,该矩阵可以传递给warpAffine进行图像的旋转。

图像旋转后显示完整图像示例代码

import cv2  
import numpy as np  
  
def rotate_image(image, angle):  
    # 获取图像尺寸  
    (h, w) = image.shape[:2]  
      
    # 计算图像中心  
    center = (w // 2, h // 2)  
      
    # 获取旋转矩阵(注意角度需要转换为弧度)  
    M = cv2.getRotationMatrix2D(center, angle, 1.0)  
      
    # 计算旋转后图像的边界框  
    cos = np.abs(M[0, 0])  
    sin = np.abs(M[0, 1])  
    nW = int((h * sin) + (w * cos))  
    nH = int((h * cos) + (w * sin))  
  
    # 调整旋转矩阵以考虑平移  
    M[0, 2] += (nW / 2) - center[0]  
    M[1, 2] += (nH / 2) - center[1]  
  
    # 执行旋转  
    rotated = cv2.warpAffine(image, M, (nW, nH))  
      
    return rotated  
  
# 读取图像  
image = cv2.imread('your_image.jpg')  
  
# 旋转图像,例如旋转45度  
rotated_image = rotate_image(image, 45)  
  
# 显示原始和旋转后的图像  
cv2.imshow("Original Image", image)  
cv2.imshow("Rotated Image", rotated_image)  
cv2.waitKey(0)  
cv2.destroyAllWindows()

3. 缩放(Resizing)

缩放通常使用resize函数,而不是通过几何变换矩阵。

cv2.resize(src, dsize, fx=0, fy=0, interpolation=cv2.INTER_LINEAR)

  • src:输入图像。
  • dsize:输出图像的大小。这是一个宽度和高度的元组。如果它是零,则通过fxfy计算大小。
  • fxfy:沿x轴和y轴的缩放比例。
  • interpolation:插值方法,用于确定如何计算输出图像中的像素值。

4. 仿射变换(Affine Transformation)

仿射变换是一个更一般的变换,包括旋转、平移、缩放和倾斜。

cv2.warpAffine(src, M, dsize, flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT, borderValue=(0,0,0))

  • src:输入图像。
  • M:2x3的变换矩阵。
  • dsize:输出图像的大小。
  • flags:插值方法。
  • borderMode:边界像素模式。
  • borderValue:当borderMode=cv2.BORDER_CONSTANT时,边界像素的值。

5. 透视变换(Perspective Transformation)

透视变换用于从一个视角转换到另一个视角,需要一个3x3的变换矩阵。

cv2.warpPerspective(src, M, dsize, flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT, borderValue=(0,0,0))

  • 参数与warpAffine相似,但M是一个3x3的透视变换矩阵。

6 图像金字塔(Image Pyramid)

在Python的OpenCV库中,图像金字塔(Image Pyramid)是一种用于图像多尺度表达的有效结构,主要用于图像特征检测、图像分割和图像压缩等领域。图像金字塔通过逐步减小图像的分辨率来创建一系列图像,这些图像以金字塔形状排列,层级越高,图像越小,分辨率越低。

OpenCV提供了两个主要的函数来实现图像金字塔的构建:cv2.pyrDown()cv2.pyrUp()

1. cv2.pyrDown(src[, dst[, dstsize[, borderType]]])

功能:对图像进行下采样(缩小),生成图像金字塔的下一层。

参数解释

  • src:输入图像,即当前层的图像。
  • dst:输出图像,即下采样后的图像。这是一个可选参数,如果提供,则输出图像会存储在这里。
  • dstsize:输出图像的大小。如果此参数为0(默认值),则输出图像的尺寸将是输入图像尺寸的一半(宽度和高度都减半)。
  • borderType:边界像素的插值方法。在大多数情况下,使用默认值cv2.BORDER_DEFAULT即可。

返回值:下采样后的图像。如果提供了dst参数,则函数返回None;否则,返回下采样后的图像。

2. cv2.pyrUp(src[, dst[, dstsize[, borderType]]])

功能:对图像进行上采样(放大),尝试从图像金字塔的下一层重建当前层。但需要注意的是,上采样并不是下采样的完全逆操作,因为上采样过程中会丢失一些信息,导致重建的图像比原始图像模糊。

参数解释

  • src:输入图像,即金字塔下一层的图像。
  • dst:输出图像,即上采样后的图像。这是一个可选参数,如果提供,则输出图像会存储在这里。
  • dstsize:输出图像的大小。如果此参数为0(默认值),则输出图像的尺寸将是输入图像尺寸的两倍(宽度和高度都加倍)。但通常建议明确指定dstsize,以匹配原始图像的尺寸或所需的尺寸。
  • borderType:边界像素的插值方法。在大多数情况下,使用默认值cv2.BORDER_DEFAULT即可。

返回值:上采样后的图像。如果提供了dst参数,则函数返回None;否则,返回上采样后的图像。

7 图像翻转(Flipping) 

cv2.flip(src, flipCode)
  • src:输入图像,即你想要翻转的图像。
  • flipCode:指定翻转方向的标志。它是一个整数,决定了图像翻转的方式。
    • flipCode为0时,表示沿x轴翻转(即上下翻转),实际上这并不会改变图像,因为x轴是水平的,而翻转通常是相对于垂直轴(y轴)或水平轴(但在这里不适用,因为x轴翻转在视觉上没有效果,除非你改变了坐标系统的解释)。但这里通常理解为参数设置错误或不适用于此上下文。
    • flipCode > 0时(通常是1),表示沿y轴翻转(即左右翻转)。
    • flipCode < 0时(通常是-1),表示沿x轴和y轴同时翻转(即上下左右翻转,相当于180度旋转)。
import cv2  
  
# 读取图像  
img = cv2.imread('your_image_path.jpg')  
  
# 左右翻转图像  
flipped_img_lr = cv2.flip(img, 1)  
  
# 上下左右翻转图像(180度旋转)  
flipped_img_udlr = cv2.flip(img, -1)  
  
# 显示原图和翻转后的图像  
cv2.imshow('Original Image', img)  
cv2.imshow('Flipped Left-Right', flipped_img_lr)  
cv2.imshow('Flipped Up-Down and Left-Right', flipped_img_udlr)  
  
cv2.waitKey(0)  
cv2.destroyAllWindows()

8 极坐标变换(Polar Transformation)

极坐标变换通常需要将图像的笛卡尔坐标(x, y)转换为极坐标(ρ, θ)。在OpenCV中,没有直接的函数来完成这个转换,但你可以通过以下步骤实现:

  1. 计算每个像素的极坐标:这通常涉及到遍历图像的每个像素,并计算其对应的ρ和θ值。

  2. 重新映射到极坐标网格:由于极坐标网格在ρ=0附近是密集的,而在ρ较大时变得稀疏,因此你可能需要创建一个新的图像,其大小取决于你想要的ρ和θ的分辨率。

  3. 插值:将原图像中的像素值映射到新的极坐标网格时,可能需要进行插值,因为源像素和目标像素之间可能不会一一对应。

由于这个过程比较复杂,且OpenCV没有直接提供这样的函数,因此通常需要自己编写代码来实现。

9 逆极坐标变换(Inverse Polar Transformation)

逆极坐标变换是极坐标变换的逆过程,即将极坐标(ρ, θ)转换回笛卡尔坐标(x, y)。同样,OpenCV没有直接的函数来完成这个转换,但你可以通过以下步骤来近似实现:

  1. 确定目标图像的大小:这取决于你想要的输出图像的分辨率。

  2. 计算每个目标像素的笛卡尔坐标:这通常是通过遍历目标图像的每个像素,并将其(x, y)坐标计算出来。

  3. 转换到极坐标:将(x, y)坐标转换为(ρ, θ),以便你可以从原始极坐标图像中检索对应的像素值。

  4. 插值:由于极坐标和笛卡尔坐标之间的映射可能不是一一对应的,因此你可能需要使用插值方法来获取最终的像素值。

链接跳转:

章节一、OpenCV||超细节的基本操作

章节二、OpenCV||超简略的Numpy小tip

章节三、OpenCV||超详细的图像处理模块

章节四、OpenCV||超详细的灰度变换和直方图修正

章节五、OpenCV||超详细的图像平滑

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

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

相关文章

如果你感到焦虑、精神内耗,那就跑步去吧!

点击上方△腾阳 关注 转载请联系授权 你好&#xff0c;我是腾阳。 深夜里&#xff0c;你是否辗转反侧、思绪万千却难以入眠&#xff1f; 面对工作截止日期压力山大、心力交瘁&#xff0c;但总提不起神&#xff0c;工作效率低下&#xff1f; 人际交往中&#xff0c;被误解和…

windows 下使用MSYS2编译ffmpeg

1. 下载ffmpeg ,最新源码下载FFmpeghttps://ffmpeg.org/ 2.下载MSYS2,并安装(正常操作步骤) MSYS2Software Distribution and Building Platform for Windowshttps://www.msys2.org/3. 安装好MSYS2后,配置编译环境 打开mingw64.e

Python 进度条:告别枯燥等待,让你的程序动感十足!

在日常编程中&#xff0c;我们经常会遇到需要处理耗时任务的情况&#xff0c;例如文件下载、数据处理等等。看着程序运行&#xff0c;却只能干巴巴地等待&#xff0c;实在令人心焦。 别担心&#xff01;今天就来教你如何使用 Python 创建炫酷的进度条&#xff0c;告别枯燥等待…

董明珠:格力正在开发“不要电”的空调!

8月2日&#xff0c;格力电器在河北召开“格力冰洗生活电器战略发布会”。格力电器董事长兼总裁董明珠在现场发表讲话&#xff0c;透露格力正在开发一个“不要电”的空调。据悉&#xff0c;2012年格力就开始开发这个技术。 董明珠表示&#xff0c;现在的光伏发电需要通过逆变器…

横屏无水印风景视频素材去哪里找啊?横屏无水印素材库分享

在进行视频创作和编辑时&#xff0c;拥有高质量的横屏无水印风景视频素材非常关键&#xff0c;尤其是当你打造旅行记录、自然纪录片或是背景视频等内容时。这类素材不仅能显著提升你的作品的视觉效果&#xff0c;还能加强其感染力。然而&#xff0c;许多创作者在寻找合适的风景…

每日学术速递8.4

1.Sparse vs Contiguous Adversarial Pixel Perturbations in Multimodal 标题&#xff1a; Models: An Empirical Analysis 多模态模型中的稀疏与连续对抗性像素扰动&#xff1a;实证分析 作者&#xff1a; Cristian-Alexandru Botocan, Raphael Meier, Ljiljana Dolamic 文…

eslint配置忽略目录和文件

本部分选自《基于vite构建vue3开发环境——eslint整合》。 默认配置下&#xff0c;咱们引入第三方的svg库js文件也会被eslint检查&#xff1a; 在eslint.config.js中增加配置&#xff1a; 注意 这里不能写成./src/assets&#xff0c;除了忽略整个目录&#xff0c;也可以通过通配…

golang命名异常 error var Xxx should have name of the form ErrFoo (ST1012) 解决方法

异常原因分析 这个提示通常发生在我们使用var 定义一个变量来接收 error异常信息时的变量名称不规范所致。 其实这里的异常信息“ error var Xxx should have name of the form ErrFoo (ST1012)” 这个提示里面也已经提醒了" 变量 Xxx 的名称格式应该为 ErrFoo ", …

网络编程相关

关于ipv4和v6 ipv4小细节-------公网和私有地址 端口 InetAddress 协议 UDP、TCP UDP通信程序 发送&#xff08;单播&#xff09;&#xff1a; 接收&#xff08;单播&#xff09;&#xff1a; UDP三种通信方式 单播和广播代码几乎相同&#xff0c;就是将&#xff1a; InetAddr…

第17课 Scratch入门篇:时钟

时钟 故事背景&#xff1a; 在一个遥远的科技星球上&#xff0c;时间对于居民们来说无比珍贵。这个星球上的居民们都是技术高手&#xff0c;他们使用先进的编程技术来管理自己的生活。然而&#xff0c;星球上的时间系统最近出现了故障&#xff0c;导致时间的流逝变得不稳定。为…

【Material-UI 组件】 Autocomplete中的 Free Solo 模式详解

文章目录 一、组件概述1.1 Free Solo 的定义1.2 适用场景 二、基础用法2.1 实现 Free Solo 模式2.2 注意事项 三、高级配置3.1 增强用户体验的设置3.2 可创建项 四、最佳实践4.1 性能优化4.2 可访问性4.3 处理非字符串选项 五、总结 Free Solo 模式允许用户输入任意值&#xff…

将本地微服务发布到docker镜像

描述 将本地springboot微服务发布到docker镜像中并启动容器 第一步 先本地idea创建一个简单的springboot服务&#xff0c;不需要连接数据库相关操作&#xff0c;只包含简单的接口功能做验证。 相关测试代码如下所示 package com.itwopqq.booting;import org.springframewor…

手写高斯牛顿求解非线性最小二乘问题

容易写错的地方&#xff1a; 注意你的residual定义是 z-h(x)&#xff0c; 还是 h(x) - z&#xff0c;这会影响到Hxb的符号。&#xff08;自己推一遍就知道了&#xff09;&#xff0c;我的习惯性定义是z-h(x) class GaussianNewtonOptimizer {// Observation: [x, y]// y std…

C语言 | Leetcode C语言题解之第318题最大单词长度乘积

题目&#xff1a; 题解&#xff1a; int maxProduct(char ** words, int wordsSize){int masks[wordsSize];memset(masks, 0, sizeof(masks));for(int i 0; i < wordsSize; i) {int len strlen(words[i]);for(int j 0; j < len; j) {masks[i] | 1 << (words[i]…

LabVIEW在DCS中的优势

DCS&#xff08;Distributed Control System&#xff0c;分布式控制系统&#xff09;是一种用于工业过程控制的自动化系统。它将控制任务分散到多个控制单元中&#xff0c;通过网络连接和协调这些单元来实现对整个过程的监控和控制。DCS通常用于大型工业设施&#xff0c;如化工…

GDB代码调试---实战版

一、GDB (1)GDB是什么 GDB&#xff08;GNU Debugger&#xff09;是一个功能强大的调试器&#xff0c;它可以用来帮助你查看另一个程序在执行时“内部”发生了什么。你可以使用GDB来执行你的程序&#xff0c;设置断点&#xff08;在某一行停止执行&#xff09;&#xff0c;在程…

【C++】模版初阶+STL简介

&#x1f680;个人主页&#xff1a;奋斗的小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 前言&#x1f4a5;1、函数模版&#x1f4a5;1.1 函数模板概念&#x1f4a5;1.2 函数模板格式&#x1f4a5;1…

pydal,一个实用的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个实用的 Python 库 - pydal。 Github地址&#xff1a;https://github.com/web2py/pydal/ 在现代应用开发中&#xff0c;数据库操作是一个核心部分。为了简化与数据库的交互…

支持 ESXi 8.0 的第 14 代 Intel 酷睿处理器选购参考

Intel 最新发布的第 14 代酷睿处理器全面支持 ESXi 8.0 支持 ESXi 8.0 的第 14 代 Intel 酷睿处理器选购参考 请访问原文链接&#xff1a;https://sysin.org/blog/intel-core-14th-gen-cpu-for-esxi/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 Intel 最新…