【每天学点AI】实战仿射变换在人工智能图像处理中的应用

devtools/2025/2/8 12:08:47/

01 引言

想象一下,当你拿起手机拍摄一张风景照时,由于角度或设备本身的限制,照片可能会有点歪斜或者变形。这时候,你是否希望有一种方法可以简单地“拉直”这张照片,让它看起来更加完美?或者,在构建虚拟现实(VR)和增强现实(AR)的世界时,如何让虚拟的东西自然地融入真实环境中?这些都可以靠仿射变换实现。

仿射变换不仅限于修复和美化静态图像,它还广泛应用于计算机视觉、机器人导航、医学影像分析等多个高科技领域。比如:

  • 计算机图形学:在计算机图形学中,仿射变换用于图像和模型的变换,如旋转、缩放和倾斜,以实现更丰富的视觉效果。

  • 机器人技术:在机器人技术中,仿射变换用于路径规划和运动变换,帮助机器人在空间中导航。

  • 医疗成像:在医疗成像领域,仿射变换用于图像配准,将不同时间或不同模态的图像对齐,以便进行比较、分析或融合。

  • 遥感图像处理:在遥感图像处理中,仿射变换用于对齐不同来源或不同时间拍摄的图像,以便进行比较、分析或融合。

  • 增强现实:在增强现实技术中,仿射变换用于将虚拟图像与现实世界对齐,以实现更加自然和无缝的交互体验。

02 概念解答

什么是仿射变换

简单来说,就像是把图片或者图形旋转、拉伸、缩放和移动,但是有个特点,就是它不会让图形的形状变得奇奇怪怪,比如直线经过仿射变换后还是直线,角度和平行关系也都保持不变。

想象一下,你有一张纸,上面画着一些图案。现在,你想把这些图案换个方向,或者让它们变大变小,或者把整个图案挪到纸的另一个位置。仿射变换就是帮你实现这些变化的数学工具。它就像是一套规则,告诉你怎么通过一些简单的操作,让图案按照你想要的方式变化,但不会扭曲图案的形状。

图片

接下来,我们以仿射变换中的旋转为例,看一下具体的操作步骤。

03 操作步骤

打开华清远见人工智能虚拟仿真本地服务管理平台,点击启动,服务启动一次即可。

图片

进入到人工智能虚拟仿真系统,单击“图像旋转”,进入实验。

图片

步骤一:图片输入

首先,导入一张原始图片,可以用平台默认的预设图片,也可以自定义输入图片。

图片

步骤二:单点旋转

这一步要操作的是

1.将旋转点平移到原点。

2.应用旋转矩阵进行旋转。

3.将旋转后的点移回原来的位置。

这样可以将任意点的旋转问题简化为原点旋转问题,便于计算。(具体的计算过程在人工智能在线实验平台手册中查看)

图片

步骤三:图片旋转

明白了单个点的旋转过程之后,其实图像旋转也很好理解,就是将图像里的每个像素点都带入仿射变换矩阵里,从而得到旋转后的新坐标。在OpenCV中,要得到仿射变换矩阵可以使用cv2.getRotationMatrix2D(),通过这个函数即可直接获取到上面的旋转矩阵,该函数需要接收的参数为:

Center:表示旋转的中心点,是一个二维的坐标点(x,y)

Angle:表示旋转的角度

Scale:表示缩放比例,可以通过该参数调整图像相对于原始图像的大小变化

所以在这一步填入两个参数:即要给图像旋转的角度(angle)和要缩放的比例(scale),根据这两个数据,求出旋转之后的坐标,就可以进行整个图像的旋转。

图片

这里可能会有一个问题,由于三角函数的值是小数,那么其乘积也会是小数,虽然OpenCV中会对其进行取整操作,但是像素点旋转之后的取整结果也有可能重合,这样就会导致可能会在旋转的过程中丢失-部分原始的像素信息。并且如果使用了scale参数进行图像的缩放的话,当图像放大时,比如一个10*10的图像放大成20*20,图像由100个像素点变成400个像素点,那么多余的300个像素点是怎么来的?而当图像缩小时,比如一个20*20的图像缩小为10*10的图像,需要丢掉300个像素点,那到底要怎么丢才能保证图像还能是一个正常的图像?因此我们需要一种方法来帮我们计算旋转后的图像中每一个像素点所对应的像素值,从而保证图像的完整性,这种方法就叫做插值法。

步骤四:插值方法

这一步可以看到平台有五种插值方法:

  • 最近邻插值:目标像素点的像素值与对应的原图像像素值相同。

  • 双线性插:利用原图中四个真实像素点的值来决定目标图中的一个像素点的值。

  • 像素区域插值:缩小图像时取平均值,放大图像时使用最近邻或双线性插值。

  • 双三次插值:需要原图像中近邻的16个点来加权。

  • Lanczos插值:需要原图像周围的64个像素点,使用不同的权重函数。

图片

通过这几种方式可以解决图像缩放或者旋转等操作时,由于像素之间的间隔不一致而导致的信息丢失和图像质量下降的问题。具体的每种方法计算方法,可在元宇宙实验平台操作手册中查看。

步骤五:边缘填充

为什么要填充边缘呢?我们以下图为例。

图片

可以看到,左图在逆时针旋转45度之后原图的四个顶点在右图中已经看不到了,同时,右图的四个顶点区域其实是什么都没有的,因此我们需要对空出来的区域进行一个填充。右图就是对空出来的区域进行了像素值为(0,0,0)的填充,也就是黑色像素值的填充。除此之外,后续的一些图像处理方式也会用到边缘填充,平台介绍了五个常用的边缘填充方法。

  • 边界复制:复制边界像素值。

  • 边界反射:根据原图边缘进行反射。

  • 边界反射101:反射边缘像素点,但方式不同。

  • 边界常数:填充指定的常数值,默认为0。

  • 边界包裹:特殊类型的边界处理。

图片

步骤六:图片输出

点击验证,如显示校验成功,即代表逻辑无误,验证按钮与校验成功界面如下图所示。

图片

点击运行,可以实现功能运行,并显示结果输出,如下图所示。点击某张图片可放大查看效果。

图片

以上就是一个完整的图像旋转操作过程,仿射变换中的图像旋转在图像识别应用场景中主要解决图像因拍摄角度不同而导致的方向不一致问题,通过旋转图像使其与标准方向对齐,确保了识别算法能够准确地识别和分析图像内容,不受角度的影响,从而提高了识别系统的准确性和鲁棒性。

仿射变换不只是图像处理中的一个关键技术,它也是计算机视觉领域的重要组成部分。因此,如果你对图像的几何变换感兴趣,想要深入了解其原理和应用,我们的Python+图像处理OpenCV课程就能帮到你。

我们的课程会带你从基础开始,学习如何用Python编程,怎么用OpenCV处理图像,还会手把手带你实战OpenCV车牌识别项目。重要的是,我们的课程还提供元宇宙人工智能在线实验平台,让你能在一个模拟的环境中,边学边练,高效学习。自由探索,尝试不同的算法,看看它们对图像有什么影响,这对理解图像增强的原理和应用特别有帮助。

后台私信雯雯老师,一起学习人工智能OpenCV~!

✅5年时间打造,元宇宙人工智能在线实验平台

✅30天趣玩趣学,算法原理+代码实现+项目实战

✅200余讲课程,边学边练,在线答疑


http://www.ppmy.cn/devtools/157084.html

相关文章

基于springboot+vue的社区居民诊疗健康管理系统设计与实现

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

全志A133 android10 thermal温控策略配置调试

一,功能介绍 Thermal简称热控制系统,其功能是通过temperature sensor(温度传感器)测量当前CPU、GPU等设备的温度值,然后根据此温度值,影响CPU、GPU等设备的调频策略,对CPU、GPU等设备的最大频率…

vLLM框架:使用大模型推理框架

vLLM 专为高效部署大规模语言模型设计,尤其适合高并发推理场景,关于对vLLM的介绍请看这篇博文。以下从 安装配置、基础推理、高级功能、服务化部署 到 多模态扩展 逐步讲解。 1. 环境安装与配置 1.1 硬件要求 GPU: 支持 CUDA 11.8 及以上(…

Android Studio:相对布局 RelativeLayout

在 Android 中,RelativeLayout 是一种布局,它允许你根据其他视图的位置来相对地定位视图。 以下面的代码为例: 案例一: android:layout_alignParentTop"true": 将视图的顶部对齐到父容器的顶部。 android:layout_cent…

verilog练习:i2c slave 模块设计

文章目录 前言1. 结构2.代码2.1 iic_slave.v2.2 sync.v2.3 wr_fsm.v2.3.1 状态机状态解释 2.4 ram.v 3. 波形展示4. 建议5. 资料总结 前言 首先就不啰嗦iic协议了,网上有不少资料都是叙述此协议的。 下面将是我本次设计的一些局部设计汇总,如果对读者有…

数据挖掘常用算法

文章目录 基于机器学习~~线性/逻辑回归~~树模型~~贝叶斯~~~~聚类~~集成算法神经网络~~支持向量机~~~~降维算法~~ 基于机器学习 线性/逻辑回归 类似单层神经网络 yk*xb 树模型 优点 可以做可视化分析速度快结果稳定 依赖前期对业务和数据的理解 贝叶斯 贝叶斯依赖先验概…

python编程-内置函数bin(),bool(),abs() ,all(),any(),ascii(),max(),min() 详解

1、bin()函数用于将整数转换为其二进制字符串表示。并返回一个以0b开头的字符串,表示该整数的二进制形式。 # 十进制数转换为二进制字符串 decimal_number 42 binary_string bin(decimal_number) print(f"Decimal {decimal_number} is {binary_string} in b…

YOLOv11实时目标检测 | 摄像头视频图片文件检测

在上篇文章中YOLO11环境部署 || 从检测到训练https://blog.csdn.net/2301_79442295/article/details/145414103#comments_36164492,我们详细探讨了YOLO11的部署以及推理训练,但是评论区的观众老爷就说了:“博主博主,你这个只能推理…