【OpenCV C++20 学习笔记】图片融合

图片融合

  • 原理
  • 实现
  • 结果展示
  • 完整代码

原理

关于OpenCV的配置和基础用法,请参阅本专栏的其他文章:垚武田的OpenCV合集

这里采用的图片熔合的算法来自Richard Szeliski的书《Computer Vision: Algorithms and Applications》(《计算机视觉:算法和应用》)。
该算法使用了一个两参的线性熔合算子来操作图片的像素:
g ( x ) = ( 1 − α ) f 0 ( x ) + α f 1 ( x ) g(x) = (1-\alpha)f_0(x)+\alpha f_1(x) g(x)=(1α)f0(x)+αf1(x)
α \alpha α的值从0-1不等。利用这个 α \alpha α值,该算法可以对两个图片或者视频执行一个临时的交叉溶解(criss-dissolve),就像在幻灯片或胶片中那样(很酷是不是?)cool, eh?

实现

在OpenCV中使用addWeighted()函数来实现上述的线性熔合的方法。
首先导入要熔合的两张图片。这两张图片是OpenCV库中自带的,可以在安装目录的子路径...\opencv\sources\samples\data中找到它们:LinuxLogo.jpgWindowsLogo.jpg。将它们复制进项目文件夹,导入语句如下:

Mat src1 { imread("LinuxLogo.jpg") };
Mat src2 { imread("WindowsLogo.jpg") };

注意:被熔合的两张图片必须大小(长和宽)一致,类型也必须一致
接着确定 α \alpha α值,并使用线性熔合算法:

double alpha{ 0.5 };
double beta{ 1.0 - alpha };
Mat dst;
addWeighted( src1, alpha, src2, beta, 0.0, dst);

这里将 α \alpha α设为0.5; β \beta β其实是算法中的 1 − α 1- \alpha 1α。这里再回到算法公式:
g ( x ) = ( 1 − α ) f 0 ( x ) + α f 1 ( x ) g(x) = (1-\alpha)f_0(x)+\alpha f_1(x) g(x)=(1α)f0(x)+αf1(x)

  • 两张图片中的每个像素值,分别就是公式中的 f 0 ( x ) f_0(x) f0(x) f 1 ( x ) f_1(x) f1(x)
  • g ( x ) g(x) g(x)就是熔合后的像素值
  • 1 − α 1- \alpha 1α(即代码中的 β \beta β)和 α \alpha α分别是两张图片的权重

然后我们来看一下在addWeighted()函数中,是怎样用各个参数来确定线性熔合算法的——
addWeighted( src1, alpha, src2, beta, 0.0, dst);

  • src1src2分别是要熔合的两张图片的Mat对象
  • alpha是公式中的 α \alpha α,即src1所代表的图片的权重
  • beta是公式中的 1 − α 1- \alpha 1α,即src2所代表的图片的权重
  • 0.0是公式中没有的一个常数 γ \gamma γ,用来对熔合后的像素值进行偏移
  • dst为储存熔合结果的Mat对象
    这样,addWeighted()函数的实际算法可以用以下公式表示:
    d s t = α ∗ s r c 1 + β ∗ s r c 2 + γ dst = \alpha *src1 + \beta *src2 + \gamma dst=αsrc1+βsrc2+γ
    代码中的 γ \gamma γ为0.0,说明不对熔合后的像素进行任何偏移。

结果展示

创建窗口,展示图片熔合的结果

imshow("线性熔合", dst);
waitKey(0);

输出结果如下:
线性熔合结果

完整代码

注意:

  • 因为C++中也有std::beta,所以为了避免名称冲突,这里没有使用整个std命名空间
  • 完整代码需要用户自己输入 α \alpha α参数的值
  • 完整代码对图片的导入进行了检测
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>import <iostream>;using namespace cv;//因为C++中有std::beta,为了避免名称冲突,这里没有使用整个std命名空间
using std::cin;
using std::cout;
using std::endl;int main() {double alpha{ 0.5 }; double beta, input;Mat src1, src2, dst;cout << "简单线性混合" << endl;cout << "-----------" << endl;cout << "* 输入α值 [0.0-1.0]";cin >> input;if (input >= 0 && input <= 1)alpha = input;src1 = imread("LinuxLogo.jpg");src2 = imread("WindowsLogo.jpg");if (src1.empty()) {cout << "图片1导入错误" << endl;return EXIT_FAILURE;}if (src2.empty()) {cout << "图片2导入错误" << endl;return EXIT_FAILURE;}beta = 1.0 - alpha;addWeighted(src1, alpha, src2, beta, 0.0, dst);imshow("线性混合", dst);waitKey(0);return 0;
}

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

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

相关文章

极简Springboot+Mybatis-Plus+Vue零基础萌新都看得懂的分页查询(富含前后端项目案例)

目录 springboot配置相关 依赖配置 yaml配置 MySQL创建与使用 &#xff08;可拿软件包项目系统&#xff09; 创建数据库 创建数据表 mybatis-plus相关 Mapper配置 ​编辑 启动类放MapperScan 启动类中配置 添加config配置文件 Springboot编码 实体类 mapperc(Dao…

LINUX -exec函数族

1、功能&#xff1a; *让父子进程来执行不相干的操作 *能够替换进程地址空间的代码.text段 *执行另外的程序&#xff0c;不需要创建额外的的地址空间 *当前程序中调用另外一个应用程序 2、执行目录下的程序&#xff1a; *指定执行目录下的程序 int execl(const char *path,…

工业三防平板,高效能与轻便性的结合

在当今数字化、智能化的工业时代&#xff0c;工业三防平板作为一种创新的设备&#xff0c;正以其独特的优势在各个领域发挥着重要作用。它不仅具备高效能的处理能力&#xff0c;还拥有出色的轻便性&#xff0c;为工业生产和管理带来了前所未有的便利。 一、高效能的核心动力 工…

Python爬虫-中国汽车市场月销量数据

前言 本文是该专栏的第34篇,后面会持续分享python爬虫干货知识,记得关注。 在本文中,笔者将通过某汽车平台,来采集“中国汽车市场”的月销量数据。 具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。废话不多说,下面跟着笔者直接往下看正文详细内容。(附…

GroupMamba实战:使用GroupMamba实现图像分类任务(一)

摘要 状态空间模型&#xff08;SSM&#xff09;的最新进展展示了在具有次二次复杂性的长距离依赖建模中的有效性能。GroupMamba解决了将基于SSM的模型扩展到计算机视觉领域的挑战&#xff0c;特别是大型模型尺寸的不稳定性和低效性。GroupMamba在ImageNet-1K的图像分类、MS-CO…

DC-DC 反激式电路的共模噪声分析

本系列文章的第 5 和第 6 部分[1-7]介绍有助于抑制非隔离 DC-DC 稳压器电路传导和辐射电磁干扰 (EMI) 的实用指南和示例。当然&#xff0c;如果不考虑电隔离设计&#xff0c;DC-DC 电源 EMI 的任何处理方式都不全面&#xff0c;因为在这些电路中&#xff0c;电源变压器的 EMI 性…

Python常用内置库介绍

Python作为一门强大且易学的编程语言&#xff0c;内置了许多功能强大的库&#xff0c;让开发者能够更加便捷地完成各种任务。本文中&#xff0c;我将详细介绍Python中常用的内置库。 math&#xff1a;提供数学函数&#xff0c;如三角函数、对数函数等。 示例&#xff1a;计算平…

web后端--Spring事务管理

事务也要日志配置 !!!!debug前面记得加空格 logging:level:org.springframework.jdbc.support.JdbcTransactionManager: debugrollbackFor 默认情况下&#xff0c;只有出现RunTimeException才会回滚事务&#xff0c;rollbackfor属性用于控制出现何种异常类型&#xff0c;回滚…

Golang | Leetcode Golang题解之第292题Nim游戏

题目&#xff1a; 题解&#xff1a; func canWinNim(n int) bool {return n%4 ! 0 }

前端开发调试工具推荐分类整理

具体前往&#xff1a;前端调试工具分类整理汇总

创维汽车滁州永通体验中心开业仪式暨超充车型区域上市会圆满成功

2024年7月20日&#xff0c;创维汽车滁州永通体验中心盛大开业&#xff0c;当日&#xff0c;创维汽车市场部经理周世鹏、安徽大区总监王大明等领导参加本次开业盛典&#xff0c;共同见证创维汽车滁州永通体验中心成功落地。 2021年&#xff0c;新能源乘用车高速发展&#xff0c;…

Yak Runner 新版本,City不City?

现在直接打开Yak Runner&#xff0c;在最中间的位置将会有三个选项以供选择&#xff0c;分别是新建文件、打开文件和打开文件夹。新建文件允许你快速的打开一个临时文件&#xff0c;以便你快速开发一个小脚本或者是使用某些你急需使用到的函数&#xff08;你知道的&#xff0c;…

引用的项目“xxxx/tsconfig.node.json”可能不会禁用发出。

vue3 报错&#xff1a; 引用的项目“xxxx/tsconfig.node.json”可能不会禁用发出。 解决&#xff1a; 进入对应的 json 文件&#xff1a; 修改&#xff1a; "noEmit": false 当 noEmit 设置为 false 时&#xff0c;TypeScript 编译器将根据项目配置生成相应的输出文…

Jvm基础(一)

目录 JVM是什么运行时数据区域线程私有1.程序计数器2.虚拟机栈3.本地方法栈 线程共享1.方法区2.堆 二、对象创建1.给对象分配空间(1)指针碰撞(2)空闲列表 2.对象的内存布局对象的组成Mark Word类型指针实例数据&#xff1a;对齐填充 对象的访问定位句柄法 三、垃圾收集器和内存…

瑞芯微平台RK3568系统开发(2)Camera 开发1

1. 前言 1.1 RK3568硬件框图 1.2 开发流程 通过gstreamer/rockit来在rockchip平台上做multimedia的开发&#xff1a; vpu_service--> mpp --> gstreamer/ffmpeg --> app vpu_service&#xff1a;驱动 mpp&#xff1a;rockchip平台的视频编解码中间件,相关说明参考…

vue3+ts+vite+electron+electron-packager打包成exe文件

目录 1、创建vite项目 2、添加需求文件 3、根据package.json文件安装依赖 4、打包 5、electron命令运行 6、electron-packager打包成exe文件 Build cross-platform desktop apps with JavaScript, HTML, and CSS | Electron 1、创建vite项目 npm create vitelatest 2、添…

【解决方案】华普微汽车智能钥匙解决方案

一、方案概述 1.什么是被动式无钥匙进入 "被动式无钥匙进入"&#xff08;Passive Keyless Entry&#xff09;是一种用于车辆、建筑物或其他设施的访问控制系统。它利用无线射频技术自动判断用户是否接近&#xff0c;并进行身份识别以执行开锁或落锁动作&#xff0c…

LabVIEW操作系列1

系列文章目录 我的记录&#xff1a; LabVIEW操作系列 文章目录 系列文章目录前言五、特殊用法5.1 取值范围表示5.2 对输入值取值范围进行限定5.3 控制多个While循环停止运行。5.4 获取按钮上的文本5.5 获取按钮上的文本【进阶】 六、使用步骤1.引入库2.读入数据 七、其余功能7.…

nodejs与npm版本对应表

Node.js — Node.js 版本 (nodejs.org)

go语言day20 使用gin框架获取参数 使用自定义的logger记录日志

Golang 操作 Logger、Zap Logger 日志_golang zap-CSDN博客 目录 一、 从控制器中获取参数的几种形式 1&#xff09; 页面请求url直接拼接参数。 2&#xff09; 页面请求提交form表单 3&#xff09; 页面请求发送json数据&#xff0c;使用上下文对象c的BindJSON()方法接…