OpenCV计算机视觉实战(12)——图像金字塔与特征缩放

    • 0. 前言
    • 1. 高斯金字塔
      • 1.1 应用场景
      • 1.2 实现过程
    • 2. 拉普拉斯金字塔
      • 2.1 应用场景
      • 2.2 实现过程
    • 3. 图像融合实例
      • 3.1 应用场景
      • 3.2 实现过程
    • 小结
    • 系列链接

0. 前言

图像金字塔技术通过对原始图像按不同分辨率进行多层次表示,不仅能提升计算效率,还能为图像融合、检测与识别提供多尺度特征。高斯金字塔 (Gaussian Pyramid) 用于构建多级低通图像,拉普拉斯金字塔 (Laplacian Pyramid) 则提取各层之间的细节信息。本节将深入介绍如何使用 OpenCV 构建高斯与拉普拉斯金字塔,并以经典的图像融合案例,展示图像金字塔在特征缩放与融合中的强大应用。

1. 高斯金字塔

高斯金字塔通过不断下采样与高斯平滑,将图像分解为一系列分辨率逐渐降低的图像,用于多尺度分析与加速算法。

1.1 应用场景

  • 多尺度目标检测:在目标尺寸未知或变化剧烈的场景(如行人检测、车牌识别)下,高斯金字塔可帮助算法在不同分辨率图像上快速定位目标
  • 加速模板匹配:先在低分辨率层做初步匹配,再在高分辨率层精细搜索,大幅减少计算量
  • 图像预览:在线地图或大尺寸全景图浏览,用金字塔在不同缩放级别下平滑加载

1.2 实现过程

  • 初次平滑:避免混叠
    • 由于下采样会丢弃高频信息,先用 cv2.GaussianBlur 做一次适度平滑
    • 核大小 ksize = 2·⌈3*alpha⌉ + 1,一般 alpha1.0~1.5
  • 连续下采样
    • cv2.pyrDown 会自动结合 5 × 5 高斯滤波与采样,对比手动 GaussianBlur + resize 更高效且抗混叠
    • 每层分辨率缩小为前一层的 1 2 \frac 12 21,层数视应用而定
  • 可视化
    • 将各层图像拼接或依次显示,便于对比分辨率变化
import cv2
import numpy as np# 1. 读取并预平滑
img = cv2.imread('1.jpeg')
alpha = 1.2
ksize = int(2 * np.ceil(3*alpha) + 1)
blur = cv2.GaussianBlur(img, (ksize, ksize), alpha)# 2. 构建高斯金字塔(5 层)
gp = [blur]
for i in range(1, 5):gp.append(cv2.pyrDown(gp[i-1]))# 3. 显示各层
for idx, layer in enumerate(gp):cv2.imshow(f'Gaussian Level {idx}', layer)
cv2.waitKey(0)
cv2.destroyAllWindows()

高斯金字塔

关键函数解析:

  • cv2.pyrDown(src):对输入图像做高斯滤波后,下采样至宽高各自减半
  • cv2.GaussianBlur(src, ksize, sigma):在下采样前做平滑,减少高频信息引发的混叠效应

2. 拉普拉斯金字塔

拉普拉斯金字塔通过相邻两层高斯金字塔的差分,提取出各尺度的细节信息,可用于图像重建与增强。

2.1 应用场景

  • 图像压缩:只存储拉普拉斯层与顶层高斯图,就能高效重建原图
  • 特效增强:对细节层做强化或减弱,可实现“锐化”“虚化”特效
  • 多分辨率融合:在图像融合中,用拉普拉斯金字塔融合能避免明显拼接痕迹

2.2 实现过程

  • 构建高斯金字塔
    • 使用上一节生成的高斯金字塔列表 gp
  • 计算拉普拉斯层
    • 对于第 i i i 层高斯图像,将其上采样 (pyrUp),使其尺寸与第 i − 1 i-1 i1 层对齐
    • 将第 i − 1 i-1 i1 层高斯图像减去上采样结果,得到第 i − 1 i-1 i1 层的拉普拉斯图像
    • 最后一层直接作为拉普拉斯金字塔的顶层
  • 重建验证
    • 从顶层开始,依次上采样并与对应拉普拉斯层相加,验证重建结果与原图接近
import cv2
import numpy as np# 1. 读取并预平滑
img = cv2.imread('1.jpeg')
alpha = 1.2
ksize = int(2 * np.ceil(3*alpha) + 1)
blur = cv2.GaussianBlur(img, (ksize, ksize), alpha)# 2. 构建高斯金字塔(5 层)
gp = [blur]
for i in range(1, 5):gp.append(cv2.pyrDown(gp[i-1]))# 3. 构建拉普拉斯金字塔
lp = []
for i in range(4):up = cv2.pyrUp(gp[i+1], dstsize=(gp[i].shape[1], gp[i].shape[0]))lap = cv2.subtract(gp[i], up)lp.append(lap)
lp.append(gp[-1])  # 顶层# 4. 重建图像
recon = lp[-1]
for i in range(3, -1, -1):recon = cv2.pyrUp(recon, dstsize=(lp[i].shape[1], lp[i].shape[0]))recon = cv2.add(recon, lp[i])cv2.imshow('Reconstructed', recon)
cv2.waitKey(0)
cv2.destroyAllWindows()

拉普拉斯金字塔

关键函数解析:

  • cv2.pyrUp(src, dstsize):将图像上采样至目标尺寸,并做插值平滑
  • cv2.subtract(src1, src2):逐像素相减,提取细节层
  • cv2.add(src1, src2):逐像素相加,用于图像重建

3. 图像融合实例

接下来,利用拉普拉斯金字塔将两幅图像在多尺度上分解,逐层融合细节,再重建,实现平滑且无明显接缝的混合效果。

3.1 应用场景

  • 无缝拼接:将两张风格迥异的图像在中间或曲线边界处平滑融合(如半脸融合、天空拼接)
  • 曝光融合:不同曝光度的同一场景,用多尺度融合获得 HDR 效果
  • 拼贴艺术:在广告、海报设计中,通过金字塔融合创造奇幻视觉效果

3.2 实现过程

  • 图像准备与对齐
    • 确保两幅图尺寸一致
    • 若需要变形对齐,可先用特征匹配 + 单应性 (Homography) 校正
  • 构建金字塔
    • 高斯:gp1, gp2
    • 拉普拉斯:lp1, lp2
  • 层级融合策略
    • 硬切:每层直接水平或竖直拼接
    • 渐变掩码:对每层生成一个软掩码(如高斯模糊的二值斑块),按权重混合 L = M·L1 + (1−M)·L2
    • 多掩码:根据图像内容动态选取掩码,如人脸融合时在面部区域采用圆形渐变
  • 金字塔重建
    • 从顶层小图开始,逐层上采样、与融合后的拉普拉斯层相加
    • 重建后可做全局色调/对比度微调,让拼接边界更自然
import cv2
import numpy as np# 1. 读取与对齐
img1 = cv2.imread('1.jpeg')
img2 = cv2.imread('2.jpeg')
img2 = cv2.resize(img2, (img1.shape[1], img1.shape[0]))# 2. 构建高斯金字塔
def build_gp(img, levels=6):gp = [img]for _ in range(levels):gp.append(cv2.pyrDown(gp[-1]))return gpgp1, gp2 = build_gp(img1), build_gp(img2)# 3. 构建拉普拉斯金字塔
def build_lp(gp):lp = []for i in range(len(gp)-1):up = cv2.pyrUp(gp[i+1], dstsize=(gp[i].shape[1], gp[i].shape[0]))lp.append(cv2.subtract(gp[i], up))lp.append(gp[-1])return lplp1, lp2 = build_lp(gp1), build_lp(gp2)# 4. 生成渐变掩码金字塔
mask = np.zeros_like(img1, dtype=np.float32)
# 中心向左右平滑过渡
cols = img1.shape[1]
mask[:, :cols//2] = 1.0
mask = cv2.GaussianBlur(mask, (51,51), 0)
gp_mask = build_gp((mask*255).astype(np.uint8), levels=6)# 5. 融合拉普拉斯层
lp_fused = []
for l1, l2, gm in zip(lp1, lp2, gp_mask):gm_f = gm.astype(np.float32)/255fused = (l1.astype(np.float32)*gm_f + l2.astype(np.float32)*(1-gm_f))lp_fused.append(fused.astype(np.uint8))# 6. 重建融合图
fused = lp_fused[-1]
for i in range(len(lp_fused)-2, -1, -1):fused = cv2.pyrUp(fused, dstsize=(lp_fused[i].shape[1], lp_fused[i].shape[0]))fused = cv2.add(fused, lp_fused[i])# 7. 全局微调
fused = cv2.detailEnhance(fused, sigma_s=10, sigma_r=0.15)cv2.imshow('Pyramid Blended', fused)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像融合

关键函数解析:

  • 渐变掩码:用 cv2.GaussianBlur 将硬掩码平滑,实现层级软混合
  • build_gp / build_lp:封装高斯与拉普拉斯金字塔构建流程,便于复用
  • cv2.detailEnhance(src, sigma_s, sigma_r):调节融合后细节与对比度,OpenCV 的画龙点睛
  • 多级融合策略:硬切、软掩码、基于内容的掩码,用于不同艺术或工程需求

小结

在本节中,我们介绍了如何在 OpenCV 中构建图像金字塔、提取多尺度特征,并应用于无缝图像融合。掌握这些技术,能够为图像处理、计算机视觉和深度学习任务提供强有力的多尺度支持。

系列链接

OpenCV计算机视觉实战(1)——计算机视觉简介
OpenCV计算机视觉实战(2)——环境搭建与OpenCV简介
OpenCV计算机视觉实战(3)——计算机图像处理基础
OpenCV计算机视觉实战(4)——计算机视觉核心技术全解析
OpenCV计算机视觉实战(5)——图像基础操作全解析
OpenCV计算机视觉实战(6)——经典计算机视觉算法
OpenCV计算机视觉实战(7)——色彩空间详解
OpenCV计算机视觉实战(8)——图像滤波详解
OpenCV计算机视觉实战(9)——阈值化技术详解
OpenCV计算机视觉实战(10)——形态学操作详解
OpenCV计算机视觉实战(11)——边缘检测详解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86604.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86604.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/86604.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【案例】基于Python的生源数据可视化分析:从Excel处理到动态地图展示

文章目录 需求分析技术要点程序流程一些细节核心代码表格的一些操作 心得体会代码汇总 需求分析 请设计一个程序,要求能够统计分析分散在不同表格中的数万条信息,以信息中的身份证号码或生源地代码字段为目标字段,统计每一年全国各省份及本省…

设计模式 | 原型模式

原型模式通过克隆机制实现对象高效创建,是性能敏感场景的利器。本文结合C示例详解实现原理、深拷贝陷阱、应用场景,并与工厂模式对比分析。 为何需要原型模式? 当遇到以下场景时,传统构造方法面临挑战: 创建成本高&am…

Go 语言中的单元测试

1、如何编写单元测试 在任何生产级别的项目开发中,单元测试都扮演着至关重要的角色。尽管许多初创项目在早期可能忽略了它,但随着项目逐渐成熟并成为核心业务,为其编写健壮的单元测试是保障代码质量和项目稳定性的必然选择。本文将带您快速掌…

8. 接口专业测试报告生成pytest-html

pytest-html 终极指南:打造专业级接口测试报告 在接口自动化测试中,清晰的测试报告是质量保障的关键。本文将深入解析如何通过pytest-html插件生成专业级测试报告。 一、核心安装与基础使用 快速安装(国内镜像) pip install -i …

Day45 Tensorboard使用介绍

目录 一、tensorboard的发展历史和原理及基本操作 1.1 发展历史 1.2 tensorboard的原理 1.3 日志目录自动管理 1.4 记录标量数据(Scalar) 1.5 可视化模型结构(Graph) 1.6 可视化图像(Image) 1.7 记…

用AI给AR加“智慧”:揭秘增强现实智能互动的优化秘密

用AI给AR加“智慧”:揭秘增强现实智能互动的优化秘密 引子:增强现实,到底还能怎么更聪明? 还记得当年Pokmon GO火爆全球的场景吗?玩家们手机对准街头,虚拟小精灵活灵活现地跳出来,那就是增强现实(AR)最经典的应用之一。随着硬件发展和算法进步,AR正逐步从“炫酷玩具…

1 Studying《Computer Vision: Algorithms and Applications 2nd Edition》1-5

目录 Chapter 1 Introduction 1.1 什么是计算机视觉? 1.2 简史 1.3 书籍概述 1.4 样本教学大纲 1.5 符号说明 1.6 其他阅读材料 Chapter 2 Image formation 2.1 几何基本元素和变换 2.2 光度图像形成 2.3 数码相机 2.4 其他阅读材料 2.5 练习 Chapter…

Augment插件macOS

macOS苹果电脑vscode-augment免费额度续杯跑满 前言 在AI辅助编程日益普及的今天,Augment作为VS Code中的智能代码助手,为开发者提供了强大的代码生成和优化功能。然而,免费版本每月300次的使用限制往往让重度用户感到困扰。本文将详细介绍如…

OpenCV CUDA模块设备层-----创建一个“常量指针访问器” 的工具函数constantPtr()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 CUDA 设备端模拟一个“指向常量值”的虚拟指针访问器,使得你可以像访问数组一样访问一个固定值。 这在某些核函数中非常有用&…

Python:操作 Excel 删除工作簿

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…

Python类型注解(Type Hints)的工程实践指南

一、类型注解的核心价值 代码可读性:明确函数输入输出类型 静态检查:配合mypy提前发现类型错误 IDE支持:提升代码补全和重构能力 文档替代:类型即文档的现代编程理念 二、基础语法规范 def greet(name: str, times: int 1)…

Hadoop RPC 分层设计的哲学:高内聚、低耦合的最佳实践

Hadoop RPC Hadoop RPC主要分为四个部分,分别是序列化层、函数调用层、网络传输层和服务器端处理框架,实现机制为: 序列化层:主要作用是将结构化对象转为字节流以便于通过网络进行传输或写入持久存储。函数调用层:主…

MybatisPlus-01.MybatisPlus介绍

一.MybatisPlus介绍 MybatisPlus是对Mybatis的增强和升级,但需要注意的是,MybatisPlus并不是取代Mybatis的,而是要做Mybatis最好的合作伙伴。左边蓝色的小鸟就是MybatisPlus的标志。 在MybatisPlus官方页面上介绍了其特点,首先&am…

人大金仓数据库jdbc连接jar包kingbase8-8.6.0.jar驱动包最新版下载(不需要积分)

看了网上的很多,都是需要下载积分的 分享一下直接访问人大金仓官网,下载对应的数据库jdbc连接jar包kingbase8-8.6.0.jar驱动包: 点击 服务与支持,然后选择 下载中心 选择对应的产品和版本,最后选择软件版本 看到有…

cf 禁止http/1.0和http/1.1的访问 是否会更安全?

使用 Cloudflare(CF)禁止 HTTP/1.0 和 HTTP/1.1 的访问,强制客户端使用 HTTP/2 或更高版本(如 HTTP/3),在某些情况下可以提升网站安全性,但也存在权衡和限制。以下是详细分析,帮你判…

【Docker基础】Docker容器管理:docker pause详解

目录 1 Docker容器管理概述 2 docker pause命令详解 2.1 命令基本语法 2.2 命令功能解析 2.3 暂停与停止的区别 3 docker pause的工作流程 3.1 工作流程概述 3.2 工作流程详解 4 docker pause的使用场景 4.1 资源临时调整 4.2 调试与检查 4.3 服务维护 4.4 数据备…

Springboot ResponseBodyAdvice 的小妙用

最近公司接触到了政府项目,在开发完成后,需要对代码做安全扫描,对系统做安全测试,在安全测试中有一项不合格,就是接口返回错误是,错误不是浏览器级别的,什么意思呢,一般我们都会封装…

Re:从零开始的文件结构(融合线性表来理解 考研向)

文件管理 & 线性表 文件管理文件的结构无结构文件 有结构文件(重点)定长与不定长记录顺序文件(类线性表)它的逻辑结构它的物理结构(存储结构)小结 索引顺序文件与多级索引顺序文件形象化理解&#xff0…

并发基础7(守护线程)

目录 1:什么守护线程 2:守护线程使用 3:守护线程案例 1:什么守护线程 守护线程是Java中的一种特殊的线程类型,它为其他线程(非守护线程)提供后台支持服务。 在Java多线程编程中&#xff0c…

蜣螂算法+四模型对比!DBO-CNN-BiLSTM-Attention系列四模型多变量时序预测

蜣螂算法四模型对比!DBO-CNN-BiLSTM-Attention系列四模型多变量时序预测(Matlab完整源码和数据) 目录 蜣螂算法四模型对比!DBO-CNN-BiLSTM-Attention系列四模型多变量时序预测(Matlab完整源码和数据)效果一…