服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++ OpenCV学习之图像金字塔与图像融合详解

C++ OpenCV学习之图像金字塔与图像融合详解

2022-10-11 15:03FrigidWinter C/C++

图像金字塔分为两种:高斯金字塔和拉普拉斯金字塔。图像金字塔在保持细节的条件下进行图像融合等多尺度编辑操作非常有用。本文将利用图像金字塔实现图像融合,需要的可以参考一下

1 金字塔

平时你听到、见到的金字塔是什么样的?

这样?

C++ OpenCV学习之图像金字塔与图像融合详解

还是这样?

C++ OpenCV学习之图像金字塔与图像融合详解

实际上除了这些,还有图像金字塔

C++ OpenCV学习之图像金字塔与图像融合详解C++ OpenCV学习之图像金字塔与图像融合详解

图像金字塔有什么用?为什么要称作图像金字塔?本文带你研究这些问题。

 

2 什么是图像金字塔?

正如生物视觉系统会处理分层次的尺寸一样,计算机视觉系统实现多分辨率图像处理的基础是图像金字塔。

考虑这样一个场景:输入系统一幅图像来检测人脸。由于事先并不知道人脸在这张图片中可能的尺寸,所以需要根据输入生成一个不同大小图像组成的金字塔(应用时常用向量存储),扫描不同层次来检测可能的人脸。

此外,图像金字塔在保持细节的条件下进行图像融合等多尺度编辑操作非常有用。

图像金字塔分为两种:

高斯金字塔

高斯金字塔是最基本的图像金字塔,用于获得原图像尺度连续的的降采样序列。高斯金字塔共分O组(Octave),每组分为S层(Layer)。组内各层图像分辨率相同但尺度逐层递增;组间图像按隔点降采样取得。

C++ OpenCV学习之图像金字塔与图像融合详解

拉普拉斯金字塔

拉普拉斯金字塔通过高斯差分得到残差图像序列,用于图像重建、图像融合、特征点检测等。具体做法如图所示:构造高斯金字塔,每组图像内相邻两层相减得到残差图像序列,从而得到拉普拉斯金字塔。所以高斯金字塔每组有s+3层,而拉普拉斯金字塔每组只有s层。

C++ OpenCV学习之图像金字塔与图像融合详解

 

3 图像金字塔有什么用?

前面已经提到,图像金字塔的作用主要有:

  • 图像重建
  • 图像多尺度特征检测
  • 图像修复
  • 图像融合

下面给出一个基于图像金字塔的图像融合算法。

1.选择待融合图像A与B,以及融合掩码M,并重采样使之具有相同大小;

2.分别取得A、B的拉普拉斯金字塔,以及M的高斯金字塔;

3.使用M的高斯金字塔作为加权,对A、B的每层特征进行融合,得到融合金字塔;

C++ OpenCV学习之图像金字塔与图像融合详解

4.融合金字塔仍为拉普拉斯金字塔,对其图像重建得到融合图像。

上面的图可能有点抽象,看看下面的例子。

C++ OpenCV学习之图像金字塔与图像融合详解

 

4 OpenCV实战图像金字塔

主函数非常简单易懂

int main()
{
  Mat img_1 = imread("1.jpg", 1);
  Mat img_2 = imread("2.jpg", 1);
  Mat dstImg;
  imgFusion(img_1, img_2, dstImg, 0.2);
  waitKey(0);
  return 0;
}

试试效果

原图

C++ OpenCV学习之图像金字塔与图像融合详解

C++ OpenCV学习之图像金字塔与图像融合详解

融合效果图

C++ OpenCV学习之图像金字塔与图像融合详解

是不是毫无违和感?其中关键的融合函数imgFusion()具体是如何实现的呢?

void imgFusion(Mat leftImg, Mat rightImg, Mat& dstImg, float threshold)
{
	vector<Mat> gaussPyrLeft, gaussPyrRight, laplacePyrLeft, laplacePyrRight;		// 声明高斯金字塔数据结构
	vector<Mat> maskGaussPyr;														// 声明掩码的高斯金字塔
	vector<Mat> blendLapPyr;														// 声明融合拉普拉斯金字塔
	Mat imgHighest;																	// 声明图像融合的起点图像
	Mat mask = Mat::zeros(PYRHEIGHT, PYRWIDTH, CV_32FC1);							// 构造掩码,大小与金字塔原图像相同
	mask(Range::all(), Range(mask.cols * threshold, mask.cols)) = 1.0;
	cvtColor(mask, mask, COLOR_GRAY2BGR);											// 将掩码颜色通道拓展,以适配原图像
	buildGaussPyr(mask, maskGaussPyr, 3);											// 建立掩码的高斯金字塔

	resize(leftImg, leftImg, Size(PYRWIDTH, PYRHEIGHT));
	resize(rightImg, rightImg, Size(PYRWIDTH, PYRHEIGHT));

	leftImg.convertTo(leftImg, CV_32F);		//转换成CV_32F, 用于和mask类型匹配,且CV_32F 类型精度高, 有利于计算
	rightImg.convertTo(rightImg, CV_32F);

	// 建立高斯金字塔与拉普拉斯金字塔
	buildGaussPyr(leftImg, gaussPyrLeft, 3);
	buildGaussPyr(rightImg, gaussPyrRight, 3);
	buildLaplacePyr(gaussPyrLeft, laplacePyrLeft, 3);
	buildLaplacePyr(gaussPyrRight, laplacePyrRight, 3);

	// 确定起点图像
	imgHighest = gaussPyrLeft.back().mul(maskGaussPyr.back()) +
		((gaussPyrRight.back()).mul(Scalar(1.0, 1.0, 1.0) - maskGaussPyr.back()));

	// 融合拉普拉斯金字塔
	blendLaplacePyr(laplacePyrLeft, laplacePyrRight, maskGaussPyr, blendLapPyr);

	// 融合图像重建
	dstImg = imgLaplaceBlend(imgHighest, blendLapPyr);
	dstImg.convertTo(dstImg, CV_8UC3);
	imshow("imgProcess::seamOpt_laplace", dstImg);
}

完整源码 提取码:1234

到此这篇关于C++ OpenCV学习之图像金字塔与图像融合详解的文章就介绍到这了,更多相关C++ OpenCV图像金字塔内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/FRIGIDWINTER/article/details/123139599

延伸 · 阅读

精彩推荐
  • C/C++makefile如何调用静态库的方法实现

    makefile如何调用静态库的方法实现

    这篇文章主要介绍了makefile如何调用静态库的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    wch_NUDT7082021-10-15
  • C/C++C++实现图书管理系统最新版

    C++实现图书管理系统最新版

    这篇文章主要为大家详细介绍了C++实现图书管理系统最新版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    名名名名6522021-11-16
  • C/C++二叉搜索树的插入与删除(详细解析)

    二叉搜索树的插入与删除(详细解析)

    添加结点其实很容易,我们只需要找到结点所行对应的位置就可以了,而且没有要求是平衡的二叉搜索树,因此每次添加结点都是在叶子结点上操作,不需...

    C语言教程网3372020-12-24
  • C/C++详解MFC/C++调用易语言的整数型和文本型与VS2010互动

    详解MFC/C++调用易语言的整数型和文本型与VS2010互动

    在本篇文章里我们给大家分享了MFC/C++调用易语言的整数型和文本型与VS2010互动相关知识点内容,有兴趣的朋友们可以参考下。...

    C++教程网5822021-07-02
  • C/C++C++利用MySQL API连接和操作数据库实例详解

    C++利用MySQL API连接和操作数据库实例详解

    这篇文章主要介绍了C++利用MySQL API连接和操作数据库实例详解的相关资料,需要的朋友可以参考下...

    C++教程网7172021-04-26
  • C/C++QT实现单词检索软件的示例代码

    QT实现单词检索软件的示例代码

    本文主要介绍了QT实现单词检索软件的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    头铁键盘侠4522022-08-30
  • C/C++C语言实现扫雷游戏

    C语言实现扫雷游戏

    这篇文章主要为大家详细介绍了C语言实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    z向前12182021-08-10
  • C/C++C/C++中的内存管理小结

    C/C++中的内存管理小结

    这篇文章主要介绍了C/C++中的内存管理小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着...

    又偷吃我氮泵_4022021-09-06