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

7.1图像平移

目录

实验原理

示例代码1

运行结果1

示例代码2

运行结果2


实验原理

OpenCV中,图像平移是一种基本的几何变换,指的是将图像中的每一个像素点沿着水平方向或垂直方向移动一定的距离。图像平移不改变图像的大小和形状,只是改变了图像的位置。在计算机视觉和图像处理领域,平移操作可以用于数据增强、图像对齐等任务。

在OpenCV中,可以通过仿射变换(Affine Transformation)来实现图像的平移。

图像平移的原理图像平移实际上是一种特殊的仿射变换,其中不涉及旋转或缩放,只是简单地将图像沿水平或垂直方向移动一段固定的距离。

仿射变换的应用仿射变换可以用于多种几何变换,

例如:

•平移:只需要修改矩阵中的tx和ty值即可。

•旋转:需要构造一个包含旋转角度的矩阵。

•缩放:通过调整矩阵中的a和d值来控制水平和垂直方向的缩放比例。

•倾斜:通过调整矩阵中的b和c值来控制剪切(shear)效果。

要使用OpenCV进行图像平移,可以通过以下步骤实现:

1.定义平移矩阵: 

2.应用平移变换

使用 cv::warpAffine 函数可以应用这个变换到图像上。首先需要创建一个与上述形式一致的平移矩阵,然后使用该函数完成平移操作。

cv::warpAffine 是 OpenCV 库中用于执行仿射变换的一个函数,它可以实现图像的旋转、缩放、剪切以及平移等操作。其函数原型如下:

void warpAffine(InputArray src,            // 输入图像OutputArray dst,           // 输出图像InputArray M,              // 2x3 的变换矩阵  仿射变换矩阵Size dsize,                // 输出图像的大小int flags = INTER_LINEAR,  // 插值方法,默认为双线性插值int borderMode = BORDER_CONSTANT, // 边界模式const Scalar& borderValue = Scalar() // 边界填充值
);函数参数说明:
•src:输入图像,可以是任何类型的单通道或多通道图像。
•dst:输出图像,与输入图像具有相同的类型,大小由dsize参数指定。
•M:仿射变换矩阵,通常是一个2x3的浮点矩阵。这个矩阵包含仿射变换所需的六个参数。
•dsize:输出图像的大小。可以指定为Size(width, height)形式或者使用 src.size() 保持与源图像相同的大小。
•flags:插值方法,默认为INTER_LINEAR(双线性插值)。其他可选的插值方法包括: •INTER_NEAREST:最近邻插值。•INTER_LINEAR:双线性插值。•INTER_CUBIC:三次样条插值。•INTER_LANCZOS4:兰茨科斯插值。
•borderMode:边界处理模式,默认为BORDER_CONSTANT(用常数值填充边界)。其他可选的边界处理模式包括: •BORDER_CONSTANT:用常数值填充边界。•BORDER_REPLICATE:边界像素值向外复制。•BORDER_REFLECT:边界像素值向内反射。反射边界,如12345反射为45454。•BORDER_WRAP:边界像素值循环。循环边界,如12345循环为34512。•borderValue:边界填充值,默认为黑色(全零向量)。只有在borderMode为BORDER_CONSTANT时有效。

总结

图像平移是通过仿射变换来实现的,它涉及到将图像中的每一个像素按照一定的方向和距离移动到新的位置。在OpenCV中,可以通过构建一个2x3的仿射变换矩阵,并使用cv::warpAffine函数来实现图像的平移。通过调整平移参数tx和ty,可以控制图像在水平方向和垂直方向的平移量。此外,还可以通过指定不同的边界处理方式来处理平移后超出原图像范围的情况。

示例代码1

#include "pch.h"
#include <opencv2/opencv.hpp>
#include <iostream>int main(int argc, char** argv)
{// 加载图像cv::Mat img = cv::imread("B3.png");if (img.empty()){std::cout << "Error: Image not found." << std::endl;return -1;}// 定义平移的距离int tx = 30; // 沿x轴平移30个像素int ty = -70; // 沿y轴平移-70个像素(向上)// 创建平移矩阵cv::Mat translationMatrix = (cv::Mat_<double>(2, 3) <<1, 0, tx,0, 1, ty);// 应用平移变换cv::Mat translatedImg;cv::warpAffine(img, translatedImg, translationMatrix, img.size());// 显示原图和翻译后的图像cv::namedWindow("Original Image", cv::WINDOW_NORMAL);cv::imshow("Original Image", img);cv::namedWindow("Translated Image", cv::WINDOW_NORMAL);cv::imshow("Translated Image", translatedImg);cv::waitKey(0);return 0;
}在这个例子中,我们加载了一张图片,
并定义了一个平移矩阵 translationMatrix。
接着我们使用 cv::warpAffine 函数,
输入原始图像、平移矩阵以及输出图像的尺寸(在这里我们保持了原始图像的大小)。
最后,我们显示原图和平移后的图像,并等待用户按键退出。

运行结果1

示例代码2

// test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include "pch.h"
#include <iostream>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <iostream>//#pragma comment(lib, "opencv_world450d.lib")  //引用引入库 //平移操作,图像大小不变
cv::Mat imageTranslation1(cv::Mat & srcImage, int x0ffset, int y0ffset)
{int nRows = srcImage.rows;int nCols = srcImage.cols;cv::Mat resultImage(srcImage.size(), srcImage.type());//遍历图像for (int i = 0; i < nRows; i++){for (int j = 0; j < nCols; j++){int x = j - x0ffset;int y = i - y0ffset;//边界判断if (x >= 0 && y >= 0 && x < nCols && y < nRows){resultImage.at<cv::Vec3b>(i, j) = srcImage.ptr<cv::Vec3b>(y)[x]; }}}return resultImage;
}
//平移操作,图形大小改变
cv::Mat imageTranslation2(cv::Mat & srcImage, int x0ffset, int y0ffset)
{//设置平移尺寸int nRows = srcImage.rows + abs(y0ffset);int nCols = srcImage.cols + abs(x0ffset);cv::Mat resultImage(nRows, nCols, srcImage.type());//图像遍历for (int i = 0; i < nRows; i++){for (int j = 0; j < nCols; j++){int x = j - x0ffset;int y = i - y0ffset;//边界判断if (x >= 0 && y >= 0 && x < nCols && y < nRows){resultImage.at<cv::Vec3b>(i, j) = srcImage.ptr<cv::Vec3b>(y)[x]; }}}return resultImage;
}int main()
{//读取图像cv::Mat srcImage = cv::imread("02.jpeg");if (srcImage.empty()){return -1;}//显示原图像cv::namedWindow("原图", CV_WINDOW_NORMAL);cv::imshow("原图", srcImage);int x0ffset = 50;int y0ffset = 80;cv::Mat resultImage1 = imageTranslation1(srcImage, x0ffset, y0ffset);cv::namedWindow("移动1", CV_WINDOW_NORMAL);cv::imshow("移动1", resultImage1);cv::Mat resultImage2 = imageTranslation2(srcImage, x0ffset, y0ffset);cv::namedWindow("移动3", CV_WINDOW_NORMAL);cv::imshow("移动3", resultImage1);x0ffset = -50;y0ffset = -80;cv::Mat resultImage3 = imageTranslation1(srcImage, x0ffset, y0ffset);cv::namedWindow("移动2", CV_WINDOW_NORMAL);cv::imshow("移动2", resultImage3);cv::waitKey(0);return 0;
}

运行结果2

相关文章:

7.1图像平移

目录 实验原理 示例代码&#xff11; 运行结果&#xff11; 示例代码&#xff12; 运行结果&#xff12; 实验原理 OpenCV中&#xff0c;图像平移是一种基本的几何变换&#xff0c;指的是将图像中的每一个像素点沿着水平方向或垂直方向移动一定的距离。图像平移不改变图像…...

海外云手机是否适合运营TikTok?

随着科技的迅猛发展&#xff0c;海外云手机逐渐成为改变工作模式的重要工具。这种基于云端技术的虚拟手机&#xff0c;不仅提供了更加便捷、安全的使用体验&#xff0c;还在电商引流和海外社媒管理等领域展示了其巨大潜力。那么&#xff0c;海外云手机究竟能否有效用于运营TikT…...

IT 行业中常见的专业名称及其含义

API&#xff08;Application Programming Interface&#xff09; API 是应用程序编程接口&#xff0c;定义了不同软件系统之间如何互相通信的规则和方式。开发人员使用 API 将应用程序与外部服务集成&#xff0c;进行数据交换或调用外部功能。 IDE&#xff08;Integrated Deve…...

全球开店,Shopee东南亚入驻指南|用友BIP电商通引领电商出海新潮流

在全球化的浪潮中&#xff0c;东南亚市场以其蓬勃的发展态势成为中国企业出海的首选之地。得益于其语言、物流、仓储、距离及政策的友好性&#xff0c;东南亚市场已成为企业海外拓展的必争之地。作为东南亚领先的电商平台&#xff0c;Shopee以其庞大的用户基础和高度的用户活跃…...

java当中什么是NIO

Java中的NIO&#xff08;Non-blocking I/O&#xff09;即非阻塞I/O&#xff0c;是Java 1.4中引入的一种新的I/O API&#xff0c;用于替代传统的I/O&#xff08;即BIO, Blocking I/O&#xff09;。与传统的阻塞式I/O相比&#xff0c;NIO提供了更高效的I/O操作&#xff0c;特别是…...

【基础】Three.js 自定义几何体和复制几何体

通过自定义顶点数据&#xff0c;可以创建任意的几何体。像threejs的长方体BoxGeometry、球体SphereGeometry等几何体都是基于BufferGeometry类构建的&#xff0c;它表示一个没有任何形状的空几何体。 1. 自定义点模型 通过javascript 类型化数组 Float32Array创建一组xyz坐标…...

如何使用ChatGPT进行高效的对话生成与优化

目录 一、对话生成的基础原理 二、如何优化对话生成的流畅性与上下文关联性 1. 提示词优化&#xff1a;明确上下文和期望目标 示例&#xff1a;提示词优化 2. 调整生成参数&#xff1a;控制生成长度与内容多样性 示例&#xff1a;调整生成参数 3. 上下文管理&#xff1a…...

MySQL系列—8.存储结构

目录 1.系统表空间 ibdata 2.通用表空间 .ibd 3.独立表空间 4.Undo 表空间 5.临时表空间 6.Redo Log File 1.系统表空间 ibdata 系统表空间由参数innodb_data_file_path定义路径、初始化大小、自动扩展策略 如&#xff1a; innodb_data_file_path/dayta/mysql/ibdata1:…...

vue2、vue3生成二维码

Vue2版&#xff1a; 工具&#xff1a;使用 qrcodejs插件来生成二维码 安装&#xff1a;npm install qrcodejs2 qrcodejs官网地址&#xff1a; https://davidshimjs.github.io/qrcodejs/https://davidshimjs.github.io/qrcodejs/ 代码示例&#xff1a; <template><…...

Spring Cloud全解析:熔断之Hystrix线程隔离导致的问题

Hystrix线程隔离 在微服务框架中&#xff0c;可能一个服务需要调用多个微服务&#xff0c;在tomcat中运行时&#xff0c;tomcat只是分配了100个线程&#xff0c;由于多个服务之间调用的时间消耗过长&#xff0c;可能会导致线程耗尽&#xff0c;而在Hystrix中存在线程隔离&…...

网络编程项目(云词典项目)

目录 一、功能要求 服务器 用户客户端 二、演示效果 1.登录、注册功能 2. 查单词功能 3.查看历史纪录功能 三、项目代码 1.头文件 2.服务器 3.用户端 一、功能要求 仿照云词典的原理&#xff0c;实现云词典功能&#xff0c;用户可以查询输入的单词的英文解释&…...

Java Spring Boot 项目中的密码加密与验证开发案例手册

本手册主要针对Java项目中的账号密码加密与验证进行详细的步骤讲解和代码示例。适用于开发登录认证、用户管理等功能的场景。文档包含工具类的创建、数据库配置、服务层和控制器层的集成等常见操作。 1. 常用加密操作 在实现安全的登录功能时&#xff0c;密码加密与验证是不可…...

VueSax-解决Vue3报错问题,并支持typescript

以下为坑点 根据官方提示&#xff0c;本人在vue3typescript的项目中添加了vuesax的组件依赖 根据正常的导入依赖思路编写代码&#xff0c;发现typescript一直报 查询vuesax的目录文件发现存在ts文件&#xff0c;于是乎觉得是自己的问题&#xff0c;就查阅gpt与网上资料&#x…...

回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测+交叉验证

回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测交叉验证 目录 回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测交叉验证效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现基于贝叶…...

[数据集][目标检测]电动车入梯进电梯电单车入梯检测数据集VOC+YOLO格式7106张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;7106 标注数量(xml文件个数)&#xff1a;7106 标注数量(txt文件个数)&#xff1a;7106 标注…...

大数常用API

package API;public class BigNum {//如果普通的long和double的精度不足以满足要求&#xff0c;那么可以使用java.math包中的两个类//BigInteger和BigDecimal//前者实现任意精度的整数运算&#xff0c;后者实现任意精度的浮点数运算//BigInteger add(BigInteger other)//BigInt…...

Gartner发布ASCA自动化安全控制评估创新洞察:三年后40%的综合安全厂商都将提供ASCA功能

复杂的安全控制网络、技能差距和快速变化的攻击技术使维持技术安全控制的最佳配置的问题更加复杂。安全和风险管理领导者可以通过自动化安全控制评估来改善他们的安全状况。 主要发现 技术安全控制配置错误是与安全漏洞相关的长期问题。薄弱的安全默认值、配置漂移、为减少误报…...

使用lspci命令获取加速卡型号

文章目录 前言一、lspci -nn 获取具体厂商及设备ID二、使用步骤三、使用3080Ti再查询一下 前言 新到的实验机器和加速卡&#xff0c;安装好之后发现lspci命令没有显示型号&#xff0c;这里记录下使用 Vendor ID和Device ID 通过网页查询获取加速卡具体型号的过程。 一、lspci …...

php代码实例强制下载文件代码例子

php代码实例强制下载文件代码例子 $filename $_GET[file]; //Get the fileid from the URL // Query the file ID $query sprintf("SELECT * FROM tableName WHERE id %s",mysql_real_escape_string($filename)); $sql mysql_query($query); if(mysql_num_rows…...

Opencv中的直方图(3)直方图比较函数compareHist()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 比较两个直方图。 函数 cv::compareHist 使用指定的方法比较两个密集或两个稀疏直方图。 该函数返回 d ( H 1 , H 2 ) d(H_1, H_2) d(H1​,H2​…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...