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 铝制底座
四张待融合图像如下:
![]() | ![]() |
---|---|
![]() | ![]() |
融合效果如下所示:
小结:从实验一与实验二的数据融合结果来看,针对原始采集数据中存在的阴影干扰、缺陷特征不突出等问题,融合后的数据显著提升了可视化效果,使得数据中的缺陷特征呈现得更为清晰、直观,便于观察与分析。