OpenCV——图像融合

news2025/4/15 0:48:17

OpenCV——图像融合

  • 一、引言
    • 1.1 图像融合分类
  • 二、C++代码实现
  • 三、效果展示
    • 3.1 标准球
    • 3.2 铝制底座

一、引言

在许多计算机视觉应用中(例如机器人运动和医学成像),需要将来自多幅图像的相关信息集成到一幅图像中。这种图像融合将提供更高的可靠性、准确性和数据质量。

多视图融合可以提高图像的分辨率,同时恢复场景的 3D 表示。多模态融合结合了来自不同传感器的图像,称为多传感器融合。其主要应用包括医学图像、监控和安全,

1.1 图像融合分类

工程师根据融合完成的阶段,在三个级别执行图像融合(image日 fusion)。

像素级图像融合。这种图像融合方法处于较低级别,且易于执行。它包含两个输入图像的特征并生成平均的单个结果图像。

特征级图像融合。它从多个来源对图像特征(大小、颜色)进行校正,从而在特征提取后生成增强图像。

基于块(区域)的图像融合。这是一项高级技术。它采用多阶段表示并根据区域计算测量值。

图像融合的层级划分图:
在这里插入图片描述

二、C++代码实现

#include <vector>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>

#include <iostream>

using namespace std;
using namespace cv;
int main()
{
	cv::Mat image1;
	cv::Mat image2;
	cv::Mat image3;
	cv::Mat image4;
	image1 = cv::imread("D:\\***\\1.bmp");
	image2 = cv::imread("D:\\***\\2.bmp");
	image3 = cv::imread("D:\\***\\3.bmp");
	image4 = cv::imread("D:\\***\\4.bmp");

	if (!image1.data)
		return 0;
	if (!image2.data)
		return 0;

	// 合并图像
	cv::Mat image5;
	cv::Mat image6;
	cv::Mat image7;
	//cv::addWeighted 用于将两张图像(image1 和 image2)按指定的权重(0.7 和 0.9)进行加权融合,结果存储在 image3 中。
	cv::addWeighted(image1, 1, image2, 1, 0., image5);   //亮度调整:gamma 设为 0.,表示不调整整体亮度。
	//cv::namedWindow("Image3", 0);
	//cv::imshow("Image3", image3);
	cv::addWeighted(image3, 1, image4, 1, 0., image6);
	cv::addWeighted(image5, 0.7, image6, 0.9, 0., image7);

	//cv::namedWindow("Image7", 0);
	//cv::imshow("Image7", image7);

	/* 新增二值化操作开始 */
	cv::Mat binaryImage;

	 方法1:全局阈值法(适合光照均匀的图像)
	double thresholdValue = 68;  // 初始阈值设为128(可根据实际情况调整)
	double maxValue = 255;        // 二值化后的最大值
	cv::threshold(image7,          // 输入图像
		binaryImage,      // 输出二值图像
		thresholdValue,   // 阈值
		maxValue,         // 超过阈值时设置的值
		cv::THRESH_BINARY // 二值化类型
	);
	// 定义结构元素(核)
	int erosion_size = 3;   // 腐蚀核大小(奇数)
	cv::Mat kernel = cv::getStructuringElement(
		cv::MORPH_RECT,     // 矩形结构元素
		cv::Size(2 * erosion_size + 1, 2 * erosion_size + 1),
		cv::Point(erosion_size, erosion_size)
	);
	// 腐蚀操作
	cv::Mat erodedImage;
	cv::erode(binaryImage, erodedImage, kernel,
		cv::Point(-1, -1),  // 锚点位置(默认中心)
		1);               // 迭代次数
// 膨胀操作(使用相同的核)
	cv::Mat dilatedImage;
	cv::dilate(erodedImage, dilatedImage, kernel,
		cv::Point(-1, -1),
		1);

	// 显示结果(可选)
	//cv::namedWindow("Original", cv::WINDOW_NORMAL);
	//cv::namedWindow("Eroded", cv::WINDOW_NORMAL);
	cv::namedWindow("Dilated", cv::WINDOW_NORMAL);
	//cv::imshow("Original", binaryImage);
	//cv::imshow("Eroded", erodedImage);
	cv::imshow("Dilated", dilatedImage);
	cv::waitKey(0);

	// 方法2:自适应阈值法(适合光照不均匀的图像)
	 //cv::adaptiveThreshold(image7, binaryImage, 255,
	 //                     cv::ADAPTIVE_THRESH_GAUSSIAN_C,
	 //                     cv::THRESH_BINARY, 11, 2);

	// 方法3:大津法(自动计算最佳阈值)
	// cv::threshold(image7, binaryImage, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);

	// 显示二值化结果
	//cv::namedWindow("Binary Image", cv::WINDOW_NORMAL);
	//cv::imshow("Binary Image", binaryImage);
	/* 新增二值化操作结束 */

	cv::waitKey(0);
	cv::destroyAllWindows();

	return 0;
}

三、效果展示

3.1 标准球

四张图像如下:

在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

融合效果如下所示:
在这里插入图片描述

3.2 铝制底座

四张待融合图像如下:

在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

融合效果如下所示:

在这里插入图片描述
小结:从实验一与实验二的数据融合结果来看,针对原始采集数据中存在的阴影干扰、缺陷特征不突出等问题,融合后的数据显著提升了可视化效果,使得数据中的缺陷特征呈现得更为清晰、直观,便于观察与分析。

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

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

相关文章

基于 Spring Boot 瑞吉外卖系统开发(四)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;四&#xff09; 新增分类 新增分类UI界面&#xff0c;两个按钮分别对应两个UI界面 两个页面所需的接口都一样&#xff0c;请求参数type值不一样&#xff0c;type1为菜品分类&#xff0c;type2为套餐分类。 请求方法都为POST。…

C语言for循环嵌套if相关题目

一、题目引入 以下代码程序运行结果是多少? 二、思路解析 进入一个for循环 a<100 进入第一个if b1不大于20为假 进入第二个if b4 a这时a自增为2 当b4时,满足第二个if条件 1.b4,a2 当b7时,满足第二个if条件 2.bb37,a3 当b10时,满足第二个if条件 …

springAOP终极总结

开头先大致说一下bean的生命周期 创建 Bean 实例 → 填充属性 → 初始化前&#xff1a; → 所有 postProcessBeforeInitialization(bean, name) 执行 init 方法&#xff08;比如 PostConstruct&#xff09; → 所有 postProcessAfterInitialization(bean, name) OK&#xff…

紫光展锐5G SoC T8300:影像升级,「定格」美好世界

影像能力已成为当今衡量智能手机性能的重要标尺之一。随着消费者对手机摄影需求日益提升&#xff0c;手机厂商纷纷在影像硬件和算法上展开激烈竞争&#xff0c;力求为用户带来更加出色的拍摄体验。 紫光展锐专为全球主流用户打造的畅享影音和游戏体验的5G SoC——T8300&#x…

视频设备轨迹回放平台用EasyCVR打造变电站智慧消防远程集中视频监控方案

一、方案背景 近年来&#xff0c;电力系统中变电站火灾事故频发&#xff0c;消防势态不容乐观。强化变电站的消防安全管理&#xff0c;成为电网企业核心的任务之一&#xff0c;预防火灾、消除隐患不容延缓。目前&#xff0c;我国消防安全领域仍面临着诸多的挑战&#xff0c;基…

每日定投40刀BTC(13)20250404 - 20250408

定投 坚持 《劲松吟》 千山寒雪覆虬枝&#xff0c; 犹自擎空展翠姿。 岂畏风霜摧瘦骨&#xff1f; 心如磐石立崖时。 十年蓄得凌云志&#xff0c; 终向苍穹吐碧丝。 莫道深冬无劲色&#xff0c; 长将孤影刻天墀。

牛客 小红杀怪

通过枚举所有使用y技能的次数来枚举出所有方案&#xff0c;选出最合适的 #include<iostream> #include<cmath> #include<algorithm> using namespace std;int a, b, x, y; int ans500;int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>&…

部署大模型不再难:DeepSeek + 腾讯云 HAI 实战教程

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

JVM中常见的垃圾回收器(Garbage Collectors)

JVM中常见的垃圾回收器&#xff08;Garbage Collectors&#xff09;的分类和描述&#xff1a; 一、新生代收集器&#xff08;Young Generation Collectors&#xff09; 新生代收集器主要负责收集新创建的对象&#xff0c;这些对象通常存活时间较短。 Serial GC • 单线程收集…

极空间NAS进阶玩法:Debian 系统安装教程

文章目录 第 1 步:下载 Debian 镜像第 2 步:创建虚拟机创建虚拟机安装操作系统第 3 步:登录 Debian第 4 步:使用 Docker 搭建跳板机远程访问参考🚀 本文目标:在极空间 NAS 中安装 Debian 12。 第 1 步:下载 Debian 镜像 下载地址:https://www.debian.org/distrib/ 第…

煤矿数据机房防静电地板:智能化时代的“隐形守护者”

在煤矿行业&#xff0c;调度室不仅是安全生产的“大脑”&#xff0c;更是数据交互的“神经中枢”。随着智能化升级&#xff0c;如今的煤矿调度室早已不再是传统的电话挂图配置&#xff0c;而是集成了高清监控、精准定位系统、智能传感器等高精密电子设备的数字化空间。然而&…

操作符详解(下)——包含整形提升

1.讲解剩下的操作符 1.1:逗号表达式 逗号表达式&#xff0c;就是用逗号隔开的多个表达式。 逗号表达式&#xff0c;从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果 例题1&#xff1a; //C的值是多少&#xff1f; int main() {int a 1;int b 2;int c (a &g…

Kairos 的野望:构建“智能体即服务”生态,让万物皆可 “Agent”

随着 AI Agent 成为 AI 领域的主要叙事&#xff0c;AI 赛道的发展也逐渐进入到 2.0 时代。聚焦于 AI Agent 概念本身&#xff0c;其是一种具备感知环境、进行决策和执行任务或服务的智能系统&#xff0c;它们通常能够理解自然语言指令&#xff0c;学习用户偏好&#xff0c;并在…

LeetCode 2968.执行操作使频率分数最大

给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 你可以对数组执行 至多 k 次操作&#xff1a; 从数组中选择一个下标 i &#xff0c;将 nums[i] 增加 或者 减少 1 。 最终数组的频率分数定义为数组中众数的 频率 。 请你返回你可以得到的 最大 频率分数。 众数指的…

多模态智能体框架MM-StoryAgent:跨模态叙事视频生成的技术突破

一、研究背景与核心价值 由上海交通大学与阿里巴巴联合研发的MM-StoryAgent系统,基于多智能体协同框架实现了故事创作到视频生成的完整自动化流程。该系统通过整合文本、视觉、语音、音效等多模态生成技术,构建了包含角色一致性保持、跨模态适配优化等创新机制的叙事内容生产…

Codeforces Round 1013 (Div. 3)

Problem - A - Codeforces 解题思路&#xff1a; 对每个需要的数字进行计数 #include<bits/stdc.h> using namespace std;int main() {int t;cin >> t;while (t--){int n;cin >> n;int two 2;int zero 3;int five 1;int three 1;int one 1;int flag …

银河麒麟系统虚拟机网络ping不通的解决方法

问题描述&#xff1a;使用NAT模式搭建了银河麒麟系统虚拟主机&#xff0c;虚拟机内部可以联网&#xff0c;可以查询到具体的ip地址&#xff0c;同时也可以在虚拟机内部ping同宿主机ip&#xff0c;但使用宿主机却无法ping同银河麒麟虚拟机ip&#xff0c;使用ssh、ftp、sftp等工具…

大数据学习(105)-大数据组件分析

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…

基于SpinrgBoot+Vue的医院管理系统-026

一、项目技术栈 Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SpringBoot 前端&#xff1a;Vue开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 二、功能介绍 (1)…

LLM 为什么使用ID,每个单词不都是有编码的吗

LLM 为什么使用ID,每个单词不都是有编码的吗 在自然语言处理(NLP)里,把文本转换为整数 ID 来表示是一种常见的做法,以下为你详细阐述使用 ID 的原因,以及是否每个单词都有编码。 使用 ID 的原因 1. 计算机可处理性 计算机没办法直接处理文本数据,因为文本是人类使用的…