计算机视觉教程2-5:图像金字塔送她一朵玫瑰(附代码)

article/2025/10/23 2:03:04

目录

  • 1 金字塔
  • 2 什么是图像金字塔?
  • 3 图像金字塔有什么用?
  • 4 OpenCV实战图像金字塔

1 金字塔

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

这样?

在这里插入图片描述

还是这样?

在这里插入图片描述

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

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

2 什么是图像金字塔?

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

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

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

图像金字塔分为两种:

  • 高斯金字塔
    高斯金字塔是最基本的图像金字塔,用于获得原图像尺度连续的的降采样序列。高斯金字塔共分 O O O组(Octave),每组分为 S S S层(Layer)。组内各层图像分辨率相同但尺度逐层递增;组间图像按隔点降采样取得。
    在这里插入图片描述
  • 拉普拉斯金字塔
    拉普拉斯金字塔通过高斯差分得到残差图像序列,用于图像重建、图像融合、特征点检测等。具体做法如图所示:构造高斯金字塔,每组图像内相邻两层相减得到残差图像序列,从而得到拉普拉斯金字塔。所以高斯金字塔每组有 s + 3 s+3 s+3层,而拉普拉斯金字塔每组只有 s + 2 s+2 s+2层。
    在这里插入图片描述

3 图像金字塔有什么用?

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

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

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

  1. 选择待融合图像A与B,以及融合掩码M,并重采样使之具有相同大小;
  2. 分别取得A、B的拉普拉斯金字塔,以及M的高斯金字塔;
  3. 使用M的高斯金字塔作为加权,对A、B的每层特征进行融合,得到融合金字塔;
    在这里插入图片描述
  4. 融合金字塔仍为拉普拉斯金字塔,对其图像重建得到融合图像。

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

在这里插入图片描述

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;
}

试试效果

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

融合效果图

在这里插入图片描述

是不是毫无违和感?其中关键的融合函数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);
}

限于篇幅,其中部分函数的实现无法贴完整,本文的完整工程代码请通过下方名片联系我获取


🚀 计算机视觉基础教程说明

章号                                    内容
  0                              色彩空间与数字成像
  1                              计算机几何基础
  2                              图像增强、滤波、金字塔
  3                              图像特征提取
  4                              图像特征描述
  5                              图像特征匹配
  6                              立体视觉
  7                              项目实战


🔥 更多精彩专栏

  • 《ROS从入门到精通》
  • 《机器人原理与技术》
  • 《机器学习强基计划》
  • 《计算机视觉教程》

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

http://chatgpt.dhexx.cn/article/5nnpCTqJ.shtml

相关文章

图像金字塔(Python实现)

图像金字塔&#xff08;Python实现&#xff09; 1 简介 在图像处理中常常会调整图像大小,最长的就是放大(zoom in)和缩小(zoom out),尽管集合变换也可以实现图像放大或者缩小 一个图像金字塔式一系列的图像组成,最底下一张式图像尺寸最大,最上方的图像尺寸最小,从空间上从上向下…

图像金字塔分层算法

一. 图像金字塔概述 欢迎关注微信公众号“智能算法”&#xff01; 1. 图像金字塔是图像中多尺度表达的一种&#xff0c;最主要用于图像的分割&#xff0c;是一种以多分辨率来解释图像的有效但概念简单的结构。 2. 图像金字塔最初用于机器视觉和图像压缩&#xff0c;一幅图像的金…

图像金字塔是什么?

一般情况下&#xff0c;我们要处理是一副具有固定分辨率的图像。但是有些情况下&#xff0c;我们需要对同一图像的不同分辨率的子图像进行处理。比如&#xff0c;我们要在一幅图像中查找某个目标&#xff0c;比如脸&#xff0c;我们不知道目标在图像中的尺寸大小。这种情况下&a…

图像处理之高斯金字塔

一&#xff1a;图像金字塔基本操作 对一张图像不断的模糊之后向下采样&#xff0c;得到不同分辨率的图像&#xff0c;同时每次得到的 新的图像宽与高是原来图像的1/2, 最常见就是基于高斯的模糊之后采样&#xff0c;得到的 一系列图像称为高斯金字塔。 高斯金字塔不同(DoG)又…

【OpenCV学习笔记】之图像金字塔(Image Pyramid)

一、尺度调整 顾名思义&#xff0c;即对源图像的尺寸进行放大或者缩小变换。在opencv里面可以用resize函数&#xff0c;将源图像精准地转化为指定尺寸的目标图像。要缩小图像&#xff0c;一般推荐使用CV_INETR_AREA(区域插值)来插值&#xff1b;若要放大图像&#xff0c;推荐使…

图像金字塔总结

本文转载自&#xff1a; http://blog.csdn.net/dcrmg/article/details/52561656 一、 图像金字塔 图像金字塔是一种以多分辨率来解释图像的结构&#xff0c;通过对原始图像进行多尺度像素采样的方式&#xff0c;生成N个不同分辨率的图像。把具有最高级别分辨率的图像放在底…

数字图像处理(21): 图像金字塔(高斯金字塔 与 拉普拉斯金字塔)

目录 1 图像金字塔简介 2 向下取样——pyrDown() 2.1 基础理论 2.2 代码示例 3 向上取样——pyrUp() 3.1 基础理论 3.2 代码示例 4 Laplacian 金字塔 4.1 基础理论 4.2 代码示例 参考资料 1 图像金字塔简介 以多个分辨率来表示图像的一种有效且概念简单的结构是图像…

图像处理(二):图像金字塔

图像金字塔是图像多尺度表达的一种&#xff0c;是一种以多分辨率来解释图像的有效且概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低&#xff0c;且来源于同一张原始图的图像集合。 高斯金字塔是常见的图像金字塔&#xff0c;如下所示&#xff1a;…

什么是图像金字塔

有些情况下&#xff0c;我们需要处理源自同一张图像的不同分辨率的图像集合。这些不同分辨率的图像组成的集合称为图像金字塔。 图像金字塔的主要类型可分为低通和带通 有两种常用图像金字塔&#xff1a; Gaussian Pyramid &#xff08;低通&#xff09;Laplacian Pyramids &…

OpenCV图像处理学习十三,图像金字塔——高斯金字塔和拉普拉斯金字塔

一.图像金字塔概念 我们在图像处理中常常会调整图像大小&#xff0c;最常见的就是放大(zoom in)和缩小&#xff08;zoom out&#xff09;&#xff0c;尽管几何变换也可以实现图像放大和缩小&#xff0c;但是这里我们介绍图像金字塔 。 一个图像金字塔是由一系列的图像组成&…

图像金字塔

图像金字塔是图像处理和计算机视觉中的概念&#xff0c;常常用于多尺度处理领域&#xff08;multiscale processing)&#xff0c;尤其早年的图像匹配、识别等算法中都用到了图像金字塔 高斯金字塔&#xff08;Gaussian pyramid&#xff09; 金字塔的底层为原始图像&#xff0…

【OpenCV 学习笔记】第十一章: 图像金字塔

第十一章: 图像金字塔 一、什么是图像金字塔 同一张图片不同分辨率的子图的集合。 图像金字塔底部是待处理的高分辨率图像&#xff0c;也就是原始图像&#xff0c;顶部是低分辨率的近似图像。一般情况下&#xff0c;都是每向上移动一级&#xff0c;图像的宽和高都降低为原来的…

openCV——图像金字塔

图像金字塔 理论基础 通常情况下&#xff0c;图像金字塔的底部是待处理的高分辨率图像&#xff08;原始图像&#xff09;&#xff0c;而顶部则为其低 分辨率的近似图像。向金字塔的顶部移动时&#xff0c;图像的尺寸和分辨率都不断地降低。通常情况下&#xff0c; 每向上移动一…

第11章:图像金字塔

第11章&#xff1a;图像金字塔 一、理论基础&#xff1a;1. 向下采样&#xff1a;2. 向上采样&#xff1a; 二、pyrDown函数使用&#xff1a;三、pyrUp函数及使用&#xff1a;四、采样可逆性研究五、拉普拉斯金字塔1. 定义&#xff1a;2. 应用&#xff1a; 什么是图像金子塔&am…

C语言for语句简单打印心形。

C语言简单for语句打印心形 #include<stdio.h> int main() {int i;int j;int k;int n;int m;printf("\n\n\n\n\n\n\n\n表白朋友圈:\n\n\n\n");for (i 1; i < 3; i){if (i 1){printf(" ");printf(&quo…

C语言暴力解法:围圈报数(解析与思考)

围圈报数 题目 解题步骤 一.整体逻辑 1.从第&#xff11;个人开始报数&#xff0c; 2.数到第&#xff4d;个人出列&#xff0c; 3.然后从出列的下一个人开始报数&#xff0c; 4.数到第&#xff4d;个人又出列&#xff0c;…&#xff0c;如此反复到所有的人全部出列为止。 二…

html 一个圆圈一个c,如何用c语言程序画一个圆?

以一个空心圆来举例。 /* 判断是是否在圆上 */ int isAtCircle(int x, int y, int r) { /* 将(x, y)转换为相当圆心(r, r)的坐标 */ int rx x - r; int ry y - r; double d sqrt(rx*rx ry*ry) - r; /*计算到圆心的距离*/ if(fabs(d) < 0.5)""> return 1; e…

在HTML 页面中如何显示带圈圈的数字

数字外面有个圈圈&#xff0c; 或者圈圈里有反底色显示&#xff0c;效果类似&#xff1a; 带圈圈的数字示例&#xff1a; ① 反色圈圈数字示例&#xff1a; ❶ 要实现上面的效果&#xff0c;使用以下技术都可以达成&#xff1a; 方式1&#xff0c;. 使用图片 <image&…

C语言打印出心形表白,初学C语言也能看懂~(3)

例2&#xff1a;C语言实现打印出心形&#xff0c;初学者的表白神器。 解题思路&#xff1a;这道例题可以分成4部分&#xff0c;前3行一部分&#xff0c;4-6行一部分&#xff0c;7-13行一部分&#xff0c;最后一行一部分&#xff0c;读者请仔细阅读注释&#xff0c;小林写的很详…

C语言-报数出圈问题(链表实现)

问题描述&#xff1a;n个人围成一圈&#xff0c;顺序编号。从第一个人开始从1到m报数&#xff0c;凡报到m的人退出圈子&#xff0c;编程求解最后留下的人的初始编号。 程序运行示例&#xff1a; 6 3&#xff08;两个输入数据之间有空格&#xff09; 1输入格式&#xff1a;scanf…