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

news2024/11/16 1:54:38

图片融合

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

原理

关于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.coloradmin.cn/o/1956564.html

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

相关文章

【C++】循环结构-for循环

for 循环语法格式&#xff1a; for(起始表达式;条件表达式;末尾循环体) {循环语句} 注意&#xff1a;括号内的三者也可以写出来写在循环语句里&#xff0c;但使用for循环就是为了使循环更加简洁明了&#xff0c;因此不仅以这么做 下面是一个实例 #include<iostream> …

ROS安装key NO_PUBKEY F42ED6FBAB17C654

解决方案 可以手工添加。 ROS1云课→18一键配置_linux ros1配置-CSDN博客 下载ros.key&#xff0c;然后手工添加到对应位置。 ros2407.key master zhangrelay / ros_book GitCode 问题描述 ros2ros2-20l1a001cd:~$ sudo apt update Hit:1 http://ftp.sjtu.edu.cn/ubunt…

010 仿muduo实现高性能服务器组件_Http协议模块

​&#x1f308;个人主页&#xff1a;Fan_558 &#x1f525; 系列专栏&#xff1a;仿muduo &#x1f4d2;代码仓库&#xff1a; 项目代码 &#x1f339;关注我&#x1f4aa;&#x1f3fb;带你学更多知识 文章目录 前言Util模块设计意义整体设计代码如下 HttpRequest模块代码如下…

初始K8s

K8S 基本概念: K8S 的全称为 Kubernetes (K12345678S)&#xff0c;PS&#xff1a;“嘛&#xff0c;写全称也太累了吧&#xff0c;不如整个缩写”。 作用&#xff1a; 用于自动部署、扩展和管理“容器化&#xff08;containerized&#xff09;应用程序”的开源系统。 可以理解成…

web自动化6-pytest③实践测试用例-回归用例web自动化

# -*- coding: utf-8 -*- """ lemut_select - 业务受理 Author: duxiaowei Date: 2024/7/17 """ import timeimport allure import pytest from selenium.webdriver.common.by import By# 业务受理 allure.feature("业务受理") class …

SQL Date Functions | SQL Time Functions 概述

SQL Date Functions | SQL Time Functions 在SQL中&#xff0c;日期和时间函数是用于处理日期和时间数据的重要工具。 SQL Date Functions | SQL Time Functions函数可以从日期时间数据中提取特定的部分、执行日期计算、格式化日期时间等操作。 No.FunctionDescription描述1…

sql注入详解【从数据库架构分析】

文章目录 简介数据库的架构sql注入概念正常语句正常回显页面在页面中使用sql语句 跨库查询sql文件读写影响条件复现读写的路径的问题 sql注入请求分类sql注入请求类型sql注入请求方式&#xff1a;sql注入数据请求格式 数据库的增删改查数据库查询数据库添加数据库删除数据库修改…

【TS】TypeScript中的接口(Interface):对象类型的强大工具

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 TypeScript中的接口(Interface):对象类型的强大工具引言1. 接口的基本概念1.1 什…

MybatisPlus核心用法

MybatisPlus核心用法 目录 MybatisPlus核心用法1.使用MybatisPlus的基本步骤&#xff1a;2.MybatisPlus是如何获取实现CRUD的数据库表信息的&#xff1f;3.MybatisPlus的常用注解有哪些&#xff1f;如果表名称和实体类名称不符合约定该怎么做&#xff1f;IdType的常见类型有哪些…

IOS微软语音转文本,lame压缩音频

在IOS开发中&#xff0c;用微软进行语音转文本操作&#xff0c;并将录音文件压缩后返回 项目中遇到了利用微软SDK进行实时录音转文本操作&#xff0c;如果操作失败&#xff0c;那么就利用原始音频文件通过网络请求操作&#xff0c;最终这份文件上传到阿里云保存&#xff0c;考…

监控服务器状态,夜莺( nightingale)方案介绍

前提 选择一台服务器&#xff0c;部署一个监控服务端&#xff0c;然后在各个windows或者linux中部署数据采集节点。 类似如下结构 目前我这边采用的技术是 https://flashcat.cloud/product/nightingale/ Nightingale 的解决方案 1 部署内容 服务端&#xff08;服务端为 c…

centos7安装思源黑体

centos7安装思源黑体 下载思源字体centos7查看目前字体查看所有字体查看所有中文字体 进入字体目录将新加的字体目录添加到fonts.conf配置文件刷新字体缓存查看效果 下载思源字体 下载地址: https://github.com/adobe-fonts/source-han-sans/releases centos7查看目前字体 查…

【MyBatis】基础操作

准备工作 准备数据库表创建 springboot工程&#xff0c;选择引入对应的起步依赖&#xff08;mybatis、mysql驱动、lombok&#xff09;application.properties中引入数据库连接信息创建对应的实体类 Emp&#xff08;实体类属性采用驼峰命名&#xff09;准备Mapper接口 EmpMappe…

排序系列 之 希尔排序

&#xff01;&#xff01;&#xff01;排序仅针对于数组哦本次排序是按照升序来的哦 介绍 英文名为ShellSort&#xff0c;又称“缩小增量排序”是直接插入排序算法的一种更高效的改进版本希尔排序是把记录按下标的指定步长分组&#xff0c;然后按照每组使用直接插入排序&#…

idea一直update indexing 卡死

打开IDEA存储应用程序的本地数据文件夹&#xff0c;关闭IDEA&#xff0c;删除caches和index文件夹下的文件&#xff0c;重新打开。

数据加密技术在数据安全中起到什么样的作用?

把数据以及一个密钥&#xff0c;通过相关的加密算法&#xff0c;进行一系列的加密算法计算处理&#xff0c;使这个数据变成密文&#xff0c;保护数据的机密性。数据加密技术是一种将原始数据&#xff08;明文&#xff09;通过算法转换成只有授权用户才能解读的格式&#xff08;…

C++客户端Qt开发——系统相关(多媒体音频)

3.多媒体&#xff08;音频、视频&#xff09; 播放声音需要引入multimedia模块 使用QSound类 仅支持的音频文件格式为.wav&#xff0c;同样使用qrc文件管理外部的资源 &#xff08;使用的.wav文件不宜过大&#xff0c;尽量在几秒内&#xff0c;否则会构建时间过长&#xff…

拓维思树障分析Tovos PowerLine 4.0.19 航线规划Tovos SmartPlan 2.0.0 下载License电力应用软件使用

Tovos PowerLine 是功能强大的输电线路智能巡检系统&#xff01;这是一个专业且智能的软件&#xff0c;能够更准确的进行巡检和对线路设备进行精确的测量&#xff0c;通过获取高精度的点云来获取精准的三维路线的地形地貌、设备设施、途径的各种物体等来精确您的三维空间信息和…

三子棋小程序

一.自定义头文件(game.h) 放入源文件需要用到的标准库头文件和函数的声明 ROW 和COL为棋盘的行和列&#xff0c;三子棋嘛&#xff0c;肯定为3啦 #pragma once #include<stdio.h> #include<String.h> #include<stdlib.h> #include<time.h> #define ROW…