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

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

目录

1 金字塔

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

这样?

image.png

还是这样?

image.png

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

image.png

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

2 什么图像金字塔

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


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


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


图像金字塔分为两种:


高斯金字塔

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


image.png

拉普拉斯金字塔

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


image.png

3 图像金字塔有什么用?

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


图像重建

图像多尺度特征检测

图像修复

图像融合

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


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

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

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


image.png

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

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


image.png

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

试试效果

原图

image.png

image.png

融合效果图

image.png

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

限于篇幅,其中部分函数的实现无法贴完整,全套代码工程文件关注下方公众号回复“CV003”获取,已经给你们打包好了哦~


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


章号                                    内容

 0                              色彩空间与数字成像

 1                              计算机几何基础

 2                              图像增强、滤波、金字塔

 3                              图像特征提取

 4                              图像特征描述

 5                              图像特征匹配

 6                              立体视觉

 7                              项目实战


🔥 更多精彩专栏:


《机器人原理与技术》

《ROS从入门到精通》

《计算机视觉教程》

《机器学习》

《嵌入式系统》

《数值优化方法》


目录
相关文章
|
3月前
|
机器学习/深度学习 编解码 自动驾驶
计算机视觉之图像到图像的翻译
图像到图像的翻译(Image-to-Image Translation)是指将一种图像从一种表示转换为另一种表示的过程。该任务的目标是在保证图像语义信息的前提下,将图像风格、颜色或其他视觉特征进行转换。该技术在计算机视觉领域具有广泛应用,例如图像风格迁移、图像修复、图像增强、超分辨率、语义分割等。
75 4
|
3月前
|
机器学习/深度学习 人工智能 测试技术
AI计算机视觉笔记二十五:ResNet50训练部署教程
该项目旨在训练ResNet50模型并将其部署到RK3568开发板上。首先介绍了ResNet50网络,该网络由何恺明等人于2015年提出,解决了传统卷积神经网络中的退化问题。项目使用车辆分类数据集进行训练,并提供了数据集下载链接。环境搭建部分详细描述了虚拟环境的创建和所需库的安装。训练过程中,通过`train.py`脚本进行了15轮训练,并可视化了训练和测试结果。最后,项目提供了将模型转换为ONNX和PT格式的方法,以便在RK3568上部署。
|
7月前
|
编解码 边缘计算 自然语言处理
2024年5月计算机视觉论文推荐:包括扩散模型、视觉语言模型、图像编辑和生成、视频处理和生成以及图像识别等各个主题
五月发布的计算机视觉领域重要论文涵盖了扩散模型、视觉语言模型、图像生成与编辑及目标检测。亮点包括:1) Dual3D提出双模式推理策略,实现高效文本到3D图像生成;2) CAT3D利用多视图扩散模型创建3D场景,仅需少量图像;3) Hunyuan-DiT是多分辨率的中文理解扩散Transformer,可用于多模态对话和图像生成;4) 通过潜在扩散模型从EEG数据重建自然主义音乐,展示复杂音频重建潜力。此外,还有关于视觉语言模型和图像编辑的创新工作,如BlobGEN用于合成具有控制性的图像。
279 3
|
5月前
|
机器学习/深度学习 XML 计算机视觉
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
|
6月前
|
算法 计算机视觉 Python
openCV 3计算机视觉 Python语言实现 笔记 第三章 使用OpenCV 3处理图像
openCV 3计算机视觉 Python语言实现 笔记 第三章 使用OpenCV 3处理图像
|
7月前
|
机器学习/深度学习 自动驾驶 算法
【计算机视觉+自动驾驶】二、多任务深度学习网络并联式、级联式构建详细讲解(图像解释 超详细必看)
【计算机视觉+自动驾驶】二、多任务深度学习网络并联式、级联式构建详细讲解(图像解释 超详细必看)
329 1
|
7月前
|
机器学习/深度学习 计算机视觉 Python
【Python计算机视觉】项目实战之图像增强imguag对关键点变换、标注框变化(附源码 超详细必看)
【Python计算机视觉】项目实战之图像增强imguag对关键点变换、标注框变化(附源码 超详细必看)
218 0
|
算法 vr&ar 计算机视觉
[笔记]Python计算机视觉编程《二》 基本的图像操作和处理
[笔记]Python计算机视觉编程《二》 基本的图像操作和处理
|
7月前
|
机器学习/深度学习 计算机视觉
AIGC核心技术——计算机视觉(CV)预训练大模型
【1月更文挑战第13天】AIGC核心技术——计算机视觉(CV)预训练大模型
643 3
AIGC核心技术——计算机视觉(CV)预训练大模型
|
3月前
|
人工智能 测试技术 API
AI计算机视觉笔记二十 九:yolov10竹签模型,自动数竹签
本文介绍了如何在AutoDL平台上搭建YOLOv10环境并进行竹签检测与计数。首先从官网下载YOLOv10源码并创建虚拟环境,安装依赖库。接着通过官方模型测试环境是否正常工作。然后下载自定义数据集并配置`mycoco128.yaml`文件,使用`yolo detect train`命令或Python代码进行训练。最后,通过命令行或API调用测试训练结果,并展示竹签计数功能。如需转载,请注明原文出处。

热门文章

最新文章