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

图像处理 -- 仿射变换之Affine Transformation

仿射变换(Affine Transformation)

仿射变换是图像处理中的一种基本操作,通过线性变换和平移实现图像的几何变换。仿射变换包括旋转、缩放、平移、翻转、错切(shear)等操作。

1. 仿射变换的作用
  • 旋转:将图像绕一个固定点(通常是图像中心)旋转一定角度。
  • 缩放:对图像进行放大或缩小,改变图像的尺寸。
  • 平移:将图像在平面上移动到指定位置。
  • 翻转:沿特定轴将图像反转,比如水平或垂直翻转。
  • 错切:将图像的某一个方向拉伸,使图像产生倾斜效果。

仿射变换在计算机视觉和图像处理中的应用非常广泛,比如在图像配准、目标检测、图像增强等领域中都可以看到仿射变换的身影。

2. 数学实现原理

仿射变换通过一个矩阵乘法和一个向量加法来实现。假设二维空间中的一个点的坐标为 ( x , y ) (x, y) (x,y),经过仿射变换后,该点的新坐标为 ( x ′ , y ′ ) (x', y') (x,y)。则有如下数学表达式:

( x ′ y ′ ) = ( a b c d ) ( x y ) + ( e f ) \begin{pmatrix} x' \\ y' \\ \end{pmatrix} = \begin{pmatrix} a & b \\ c & d \\ \end{pmatrix} \begin{pmatrix} x \\ y \\ \end{pmatrix} + \begin{pmatrix} e \\ f \\ \end{pmatrix} (xy)=(acbd)(xy)+(ef)

这里, ( a b c d ) \begin{pmatrix} a & b \\ c & d \end{pmatrix} (acbd) 是 2x2 仿射变换矩阵, ( e f ) \begin{pmatrix} e \\ f \end{pmatrix} (ef) 是平移向量。

具体仿射变换:
  1. 平移
    x ′ = x + e , y ′ = y + f x' = x + e, \quad y' = y + f x=x+e,y=y+f
    其中, e e e f f f 是平移量。

  2. 旋转
    x ′ = x ⋅ cos ⁡ ( θ ) − y ⋅ sin ⁡ ( θ ) , y ′ = x ⋅ sin ⁡ ( θ ) + y ⋅ cos ⁡ ( θ ) x' = x \cdot \cos(\theta) - y \cdot \sin(\theta), \quad y' = x \cdot \sin(\theta) + y \cdot \cos(\theta) x=xcos(θ)ysin(θ),y=xsin(θ)+ycos(θ)
    其中, θ \theta θ 是旋转角度。

  3. 缩放
    x ′ = x ⋅ s x , y ′ = y ⋅ s y x' = x \cdot s_x, \quad y' = y \cdot s_y x=xsx,y=ysy
    其中, s x s_x sx s y s_y sy 是在 x 轴和 y 轴上的缩放比例。

  4. 错切
    x ′ = x + λ y ⋅ y , y ′ = y + λ x ⋅ x x' = x + \lambda_y \cdot y, \quad y' = y + \lambda_x \cdot x x=x+λyy,y=y+λxx
    其中, λ x \lambda_x λx λ y \lambda_y λy 是在 x 轴和 y 轴上的错切系数。

3. 注意事项
  1. 矩阵可逆性:为了保证仿射变换能被逆变换,仿射变换矩阵 ( a b c d ) \begin{pmatrix} a & b \\ c & d \end{pmatrix} (acbd) 必须是非奇异的,即其行列式不为 0。这确保了变换后的图像可以通过逆变换恢复原状。

  2. 边界处理:仿射变换可能导致图像的一部分移出图像边界,或者图像空白区域增加。因此,通常需要对图像进行裁剪或填充处理。

  3. 插值方法:在仿射变换过程中,目标图像中的像素可能对应源图像中非整数坐标的点,因此需要使用插值方法(如最近邻插值、双线性插值或双三次插值)来计算这些点的像素值。

  4. 保持图像质量:频繁进行仿射变换可能导致图像质量下降,比如模糊、锯齿效应等。因此,在设计变换时需要考虑如何最小化质量损失。

  5. 变换顺序:如果需要执行多个变换,变换的顺序会影响最终结果。例如,旋转后再平移和先平移后旋转的结果是不一样的。因此,需要谨慎设计变换的顺序以达到预期效果。

C代码示例

#include <stdio.h>
#include <stdlib.h>
#include <math.h>#define IMAGE_WIDTH 1088
#define IMAGE_HEIGHT 1288
#define DEGREE_TO_RADIAN(deg) ((deg) * M_PI / 180.0)// 图像数据结构
typedef struct {int width;int height;unsigned char *data; // 指向图像像素数据的指针
} Image;// 从RAW8文件读取图像数据
Image *read_raw8_image(const char *filename, int width, int height) {FILE *file = fopen(filename, "rb");if (!file) {printf("无法打开文件 %s\n", filename);return NULL;}// 在堆上为图像数据分配内存unsigned char *data = (unsigned char *)malloc(width * height * sizeof(unsigned char));if (!data) {printf("内存分配失败\n");fclose(file);return NULL;}// 读取图像数据fread(data, sizeof(unsigned char), width * height, file);fclose(file);// 创建Image结构并返回Image *image = (Image *)malloc(sizeof(Image));image->width = width;image->height = height;image->data = data;return image;
}// 将图像数据写入RAW8文件
void write_raw8_image(const char *filename, Image *image) {FILE *file = fopen(filename, "wb");if (!file) {printf("无法打开文件 %s\n", filename);return;}// 写入图像数据fwrite(image->data, sizeof(unsigned char), image->width * image->height, file);fclose(file);
}
// 释放图像内存
void free_image(Image *image) {if (image) {if (image->data) {free(image->data);}free(image);}
}// 仿射变换函数:旋转图像
Image *affine_transform(Image *image, float angle) {int width = image->width;int height = image->height;// 角度转弧度float radians = DEGREE_TO_RADIAN(angle);float cos_theta = cos(radians);float sin_theta = sin(radians);// 中心点int center_x = width / 2;int center_y = height / 2;// 在堆上为旋转后的图像数据分配内存Image *rotated_image = (Image *)malloc(sizeof(Image));rotated_image->width = width;rotated_image->height = height;rotated_image->data = (unsigned char *)malloc(width * height * sizeof(unsigned char));// 初始化旋转后图像为0(黑色)for (int i = 0; i < width * height; i++) {rotated_image->data[i] = 0;}// 遍历原始图像的每一个像素for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++) {// 计算相对于中心点的偏移int x_offset = x - center_x;int y_offset = y - center_y;// 进行仿射变换(旋转)int new_x = (int)(cos_theta * x_offset + sin_theta * y_offset) + center_x;int new_y = (int)(-sin_theta * x_offset + cos_theta * y_offset) + center_y;// 检查新坐标是否在图像范围内if (new_x >= 0 && new_x < width && new_y >= 0 && new_y < height) {rotated_image->data[new_y * width + new_x] = image->data[y * width + x];}}}return rotated_image;
}
int main() {// 读取RAW8图像Image *image = read_raw8_image("input.raw", IMAGE_WIDTH, IMAGE_HEIGHT);if (!image) {return 1;}// 对图像进行15度旋转Image *rotated_image = affine_transform(image, 15.0);// 保存旋转后的图像write_raw8_image("rotated_output.raw", rotated_image);// 释放内存free_image(image);free_image(rotated_image);return 0;
}

相关文章:

图像处理 -- 仿射变换之Affine Transformation

仿射变换&#xff08;Affine Transformation&#xff09; 仿射变换是图像处理中的一种基本操作&#xff0c;通过线性变换和平移实现图像的几何变换。仿射变换包括旋转、缩放、平移、翻转、错切&#xff08;shear&#xff09;等操作。 1. 仿射变换的作用 旋转&#xff1a;将图…...

Nuxt3【项目配置】nuxt.config.ts

按环境添加配置 export default defineNuxtConfig({// 生产环境的配置$production: {routeRules: {/**: { isr: true }}},// 开发环境的配置$development: {//} })运行时的配置 runtimeConfig export default defineNuxtConfig({runtimeConfig: {// 只在服务器端可用的私有键ap…...

中智讯“2024高校人工智能边缘应用项目实战师资培训班”圆满举办

7月24日——7月28日&#xff0c;中智讯“2024高校人工智能&边缘应用项目实战师资培训班”在昆明理工大学成功举办。本次培训由昆明理工大学人工智能产业学院主办&#xff0c;中智讯&#xff08;武汉&#xff09;科技有限公司承办。来自昆明理工大学、西南林业大学、云南民族…...

IIS发布打包后文件

1.打开IIS软件 2 添加网站&#xff0c; 自定义网站名称-选择要放置的资源路径-选择IP地址 3.打开放置的资源目录放置打包后文件 4.选择浏览 搜索不到IIS可进行一下操作 控制面板-程序和功能-启用或关闭windows功能-勾选IIS...

四个自定义 SHAP 图

超越 Python 包&#xff0c;创建 SHAP 值的定制可视化 SHAP 值是了解模型如何进行预测的绝佳工具。SHAP 包提供了许多可视化效果&#xff0c;使这个过程更加简单。话虽如此&#xff0c;我们不必完全依赖这个包。我们可以通过创建自己的 SHAP 图来进一步了解模型的工作原理。在本…...

为什么使用HTTPS?

HTTPS现在是所有Web活动的首选协议&#xff0c;因为它是用户保护敏感信息的最安全方式。 HTTPS不仅对请求用户信息的网站至关重要。除了用户直接发送的信息外&#xff0c;攻击者还可以从不安全的连接中跟踪行为和身份数据。 HTTP为网站所有者带来的好处除了数据安全之外&…...

软件设计-系统架构师(五十五)

1在网络规划中&#xff0c;政府内外网之间应该部署网络安全防护设备。在下图部署的设备A是&#xff08;&#xff09;&#xff0c;对设备A作用描述错误的是&#xff08;&#xff09;。 问题1 A IDS B 防火墙 C 网闸 D UTM 问题2 A 双主机系统&#xff0c;即使外网被黑客攻击…...

三分钟学会线缆电流估算

今天带你用三分钟的时间,学会电源线承受电流估算,不浪费时间,直接开始吧。 工作温度30℃,长期连续90%负载下的载流量 1.5平方毫米――14A  2.5平方毫米――26A   4平方毫米――32A   6平方毫米――47A    16平方毫米――92A   25平方毫米――120A   3…...

Snipaste 的一款替代工具 PixPin,支持 gif 截图、长截图和 OCR 文字识别,功能不是一点点强!

Snipaste 的一款替代工具 PixPin&#xff0c;支持 gif 截图、长截图和 OCR 文字识别&#xff0c;功能不是一点点强&#xff01; PixPin 的名字来源于“Pixel Pin”&#xff0c;简单来说是一个截图、贴图的工具&#xff0c;但是 PixPin 以截图和贴图两大功能为核心做了大量的优…...

Oracle基础教程

体系结构 数据库 一个操作系统仅有一个数据库 实例 拥有一系列后台进程和存储结构&#xff0c;一个数据库可拥有一个或多个实例&#xff0c;一般只有1个实例 数据文件&#xff08;.dbf/.ora&#xff09; 数据文件是数据库的物理存储单元&#xff0c;一个表空间由一个或多…...

电脑如何录屏?三款电脑录屏工具分享

电脑如何录屏&#xff1f;作为一个经常需要录制电脑屏幕大职场人&#xff0c;不是为了制作教程、记录会议&#xff0c;就是偶尔想自己做个游戏解说视频。市面上的录屏软件琳琅满目&#xff0c;经过一番尝试和比较&#xff0c;我选出了三款我个人认为表现不错的软件&#xff0c;…...

idea2024建立maven web项目servlet 6.0

(1) 下载好tomcat 10.1.28 打开tomcat.apache.org官网下载 &#xff08;2&#xff09;配置好maven &#xff08;3&#xff09;idea 2024打开&#xff0c;建立项目 选择maven java项目 &#xff08;4&#xff09;在项目src/main/下 建立webapp/WEB-INF目录&#xff0c;在…...

游戏开放式新手引导框架设计

强制性引导&#xff1a;只能点某个按钮 优&#xff1a;程序简单 缺&#xff1a; 玩家体验差 开放式引导&#xff1a;不强制点 优&#xff1a;玩家体验好 缺&#xff1a; 程序复杂 需求分析&#xff1a; 1.开放式引导&#xff0c;引导是到达某个条件后进行一系列行为&#xff08…...

【Hot100】LeetCode—189. 轮转数组

目录 1- 思路自定义 reverse 翻转函数 2- 实现⭐189. 轮转数组——题解思路 3- ACM 实现 原题链接&#xff1a;189. 轮转数组 1- 思路 自定义 reverse 翻转函数 2- 实现 ⭐189. 轮转数组——题解思路 class Solution {public void rotate(int[] nums, int k) {k % nums.lengt…...

javaweb学习之HTML(一)

推荐学习使用网站 w3school 在线教程 认识HTML HTML&#xff08;HyperText Markup Language&#xff09;是超文本标记语言&#xff0c;它是一个用于创建网页和网页应用程序的标准标记语言。HTML文档由一系列的元素&#xff08;elements&#xff09;组成&#xff0c;这些元素通…...

项目实战:Qt+Opencv相机标定工具v1.3.0(支持打开摄像头、视频文件和网络地址,支持标定过程查看、删除和动态评价误差率,支持追加标定等等)

若该文为原创文章&#xff0c;转载请注明出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/141334834 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、Op…...

【数据结构】汇总八、排序算法

排序Sort 【注意】本章是 排序 的知识点汇总&#xff0c;全文1万多字&#xff0c;含有大量代码和图片&#xff0c;建议点赞收藏&#xff08;doge.png&#xff09;&#xff01;&#xff01; 【注意】在这一章&#xff0c;记录就是数据的意思。 排序可视化网站&#xff1a; D…...

Java-分割list并执行多线程任务的工具类

要创建一个用于分割列表并执行多线程任务的工具类,你可以使用 Java 的 ExecutorService 和 ThreadPoolExecutor 来实现。下面是一个详细的示例,展示了如何创建这样一个工具类。 步骤 1: 创建线程池 首先,创建一个线程池来执行任务。 步骤 2: 分割列表 接着,定义一个方…...

Springboot-从服务器获取一个输入流,转成视频文件存到oss

要在Spring Boot应用中从服务器获取一个输入流,然后将该流转换为视频文件并存储到阿里云 OSS中,你可以遵循以下步骤: 设置阿里云OSS客户端:首先,你需要配置阿里云OSS客户端,以便能够上传文件到OSS。 获取输入流:使用HTTP客户端(如RestTemplate或WebClient)从服务器…...

[Meachines] [Easy] Bastion SMB未授权访问+VHD虚拟硬盘挂载+注册表获取NTLM哈希+mRemoteNG远程管理工具权限提升

信息收集 IP AddressOpening Ports10.10.10.134TCP:22, 135, 139, 445, 5985, 47001, 49664, 49665, 49666, 49667, 49668, 49669, 49670 $ nmap -p- 10.10.10.134 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH fo…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

前端开发者常用网站

Can I use网站&#xff1a;一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use&#xff1a;Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站&#xff1a;MDN JavaScript权威网站&#xff1a;JavaScript | MDN...