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

OpenCV——图像融合

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 铝制底座

四张待融合图像如下:

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

融合效果如下所示:

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

相关文章:

  • 2025 年陕西消防设施操作员考试攻略:历史文化名城的消防传承与创新​
  • 基于FreeRTOS和LVGL的多功能低功耗智能手表
  • 2024 蓝桥杯 Java 研究生组
  • 基于STM32与应变片的协作机械臂力反馈控制系统设计与实现---5.2 工业机械臂系统性能测试全方案(专业工程级)
  • 增长黑客:激活实验助力增长
  • [Scade One] Swan与Scade 6的区别 - signal 特性的移除
  • 边缘计算网关:开启物联网新时代的钥匙
  • Llama 4全面评测:官方数据亮眼,社区测试显不足之处
  • 蓝桥杯c++每日刷题(洛谷)
  • mpu6050读who_am_i寄存器一直读0x7c
  • 蓝叠模拟器过检测全攻略
  • 设计模式(23种设计模式简介)
  • 多线程(进阶)(内涵面试题)
  • CF29D Ant on the Tree
  • openMP开发
  • 基于 Spring Boot 瑞吉外卖系统开发(四)
  • 博途 TIA Portal之1200做主站与汇川EASY的TCP通讯
  • 【第39节】windows编程:打造MFC版本任务管理器
  • C++11QT复习 (十九)
  • 大模型本地部署系列(2) Ollama部署DeepSeek-R1
  • wordpress 全站pjax/长沙网站seo优化排名
  • 怎么做网站底部文件/网址搜索
  • 做网站哪里的好/怎么做网站优化排名
  • 莆田哪里有做网站的/郑州seo排名工具
  • 网页制作工作网站/安卓aso
  • 莱芜金点子电子版报纸/seo的定义