OpenCV 图像预处理—图像金字塔

news2025/2/21 19:45:42

文章目录

    • 相关概念
      • 高斯金字塔
      • 拉普拉斯金字塔
      • 应用
    • 构建高斯金字塔为什么要对当前层进行模糊?
      • 1. 平滑处理
      • 2. 减少混叠(Aliasing)
      • 3. 多尺度表示
      • 4. 图像降采样
    • 举个栗子
      • 创建高斯金字塔和拉普拉斯金字塔,并用拉普拉斯金字塔恢复图像

相关概念

高斯金字塔(Gaussian Pyramid)和拉普拉斯金字塔(Laplacian Pyramid)是图像处理中的两种多尺度表示方法,用于图像的分层处理和分析。

高斯金字塔

在这里插入图片描述

高斯金字塔是一系列按分辨率逐层降低的图像集合,每层图像通过对上一层图像进行高斯模糊和下采样得到。具体步骤如下:

  1. 高斯模糊:对图像进行高斯模糊处理,减少高频成分。
  2. 下采样:将模糊处理后的图像按一定比例缩小(通常为2)。

这样逐层处理,直到图像变得非常小。高斯金字塔用于图像的多尺度分析,例如图像金字塔法则在图像压缩、特征提取等领域的应用。

构建高斯金字塔的步骤:

  1. 从原始图像开始,作为金字塔的最底层。
  2. 对当前层图像进行高斯模糊。
  3. 对模糊后的图像进行下采样,得到下一层图像。
  4. 重复步骤2和步骤3,直到达到预定的层数或图像尺寸小于一定阈值。

拉普拉斯金字塔

拉普拉斯金字塔是高斯金字塔的一种变体,通过记录每层图像与其上层图像之间的差异来构建。具体步骤如下:

  1. 高斯金字塔:首先构建高斯金字塔。
  2. 图像差异:计算高斯金字塔中每层图像与上层图像的差异。具体来说,对高斯金字塔中的每一层图像进行上采样,并减去相应的上一层图像,得到当前层的拉普拉斯金字塔图像。

拉普拉斯金字塔常用于图像压缩和图像融合等领域,因为它能够有效地表示图像的细节信息。

构建拉普拉斯金字塔的步骤:

  1. 构建高斯金字塔。
  2. 对高斯金字塔的每一层图像进行上采样。
  3. 计算上采样图像与其上层图像的差异,得到当前层的拉普拉斯金字塔图像。
  4. 重复步骤2和步骤3,直到达到金字塔顶层。

应用

  • 图像压缩:拉普拉斯金字塔可以用于图像压缩,因为它可以有效地表示图像的边缘和细节信息。
  • 图像融合:在多分辨率图像融合中,拉普拉斯金字塔可以用于将不同分辨率的图像融合在一起,保留更多的细节信息。
  • 图像增强:通过高斯金字塔,可以对图像进行多尺度的平滑处理,有助于去噪和图像增强。

这两种金字塔结构在图像处理和计算机视觉领域都有着广泛的应用。

构建高斯金字塔为什么要对当前层进行模糊?

构建高斯金字塔时对当前层进行高斯模糊(Gaussian Blur)有几个重要的原因:

1. 平滑处理

高斯模糊是对图像进行平滑处理,减少高频噪声和细节。这种平滑处理能够避免在下采样时出现锯齿效应(aliasing),使得下采样后的图像更加平滑和自然。

2. 减少混叠(Aliasing)

混叠效应是指在图像下采样过程中,高频分量折叠回低频分量,导致图像失真。高斯模糊通过平滑处理去除高频分量,减少了混叠效应,使得下采样后的图像更能真实地反映原图像的特征。

3. 多尺度表示

高斯金字塔的构建旨在获得图像的多尺度表示。通过对图像进行高斯模糊并逐层下采样,可以生成一系列分辨率不同的图像,每一层图像代表原图像的不同尺度。这种多尺度表示在图像处理和分析中具有重要意义,可以用于图像金字塔压缩、特征提取和物体检测等任务。

4. 图像降采样

在进行降采样时,如果直接对原始图像进行下采样,可能会丢失图像中的细节和重要信息。高斯模糊使得图像在降采样之前得到平滑处理,从而在降采样过程中保留更多的关键信息,使得金字塔中各层图像能够更好地代表原图像。

举个栗子

该代码构建了三层高斯金字塔

int main()
{
    string imagePath = "C:\\Users\\Marxist\\Pictures\\coco\\show_jpg.jpg";
    string mix_image_path = "C:\\Users\\Marxist\\Pictures\\coco\\Linux.jpg";
    Mat image = imread(imagePath);//读取灰度图像
    Mat resize_image ;
    resize(image,resize_image,Size(500,500));
    imshow("source image",resize_image);
    Mat g1 ,g2 ,g3;
    pyrDown(resize_image,g1,Size(250,250));
    pyrDown(g1,g2,Size(125,125));
    imshow("g1",g1);
    imshow("g2",g2);
    waitKey();
    return 0;
}

在这里插入图片描述

创建高斯金字塔和拉普拉斯金字塔,并用拉普拉斯金字塔恢复图像

int main()
{
    string imagePath = "C:\\Users\\Marxist\\Pictures\\coco\\show_jpg.jpg";
    string mix_image_path = "C:\\Users\\Marxist\\Pictures\\coco\\Linux.jpg";
    Mat image = imread(imagePath);//读取灰度图像
    Mat resize_image ;
    imshow("source image",image);

//    By default, size of the output image is computed as `Size((src.cols+1)/2, (src.rows+1)/2)`,如果Size不指定,就是默认缩一半
//    pyrDown(resize_image,g1,Size(250,250));

    // 构建高斯金字塔
    vector<Mat> gaussian_pyramid;
    Mat current_image = image;
    for (int i = 0; i < 3; ++i) {
        Mat down;
        pyrDown(current_image, down);
        gaussian_pyramid.push_back(down);
        current_image = down;
    }

    
    // 构建拉普拉斯金字塔
    vector<Mat> laplacian_pyramid;
    for (int i = 0; i < gaussian_pyramid.size() - 1; ++i) {
        Mat up;
        pyrUp(gaussian_pyramid[i + 1], up, gaussian_pyramid[i].size());
        Mat laplacian = gaussian_pyramid[i] - up;
        laplacian_pyramid.push_back(laplacian);
    }

    // 最顶层高斯金字塔图像也加入拉普拉斯金字塔
    laplacian_pyramid.push_back(gaussian_pyramid.back());

    // 显示拉普拉斯金字塔
    for (int i = 0; i < laplacian_pyramid.size(); ++i) {
        imshow("Laplacian Pyramid Level " + to_string(i + 1), laplacian_pyramid[i]);
    }

    // 从拉普拉斯金字塔恢复原始图像
    Mat reconstructed_image = laplacian_pyramid.back(); // 从最顶层开始
    for (int i = laplacian_pyramid.size() - 2; i >= 0; --i) {
        Mat up;
        pyrUp(reconstructed_image, up, laplacian_pyramid[i].size());
        reconstructed_image = up + laplacian_pyramid[i];
    }

    // 显示恢复的图像
    imshow("Reconstructed Image", reconstructed_image);

    waitKey(0);

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《汇编语言 基于x86处理器》- 读书笔记 - 第3章-汇编语言基础

《汇编语言 基于x86处理器》- 读书笔记 - 第3章-汇编语言基础 3.1 基本语言元素3.1.1 第一个汇编语言程序常见汇编语言调用规范 3.1.2 整数常量&#xff08;基数、字面量&#xff09;3.1.3 整型常量表达式3.1.4 实数常量十进制实数十六进制实数&#xff08;编码实数&#xff09…

使用git命令行的方式,将本地项目上传到远程仓库

在国内的开发环境中&#xff0c;git的使用是必不可少的。Git 是一款分布式版本控制系统&#xff0c;用于有效管理和追踪文件的变更历史及协作开发。本片文章就来介绍一下怎样使用git命令行的方式&#xff0c;将本地项目上传到远程仓库&#xff0c;虽然现在的IDE中基本都配置了g…

Ubuntu安装terminator教程

Terminator 是一个高级的终端仿真器,专为 Linux 和 Unix 系统设计。它的主要特点是提供了丰富的多窗口和多标签功能,使用户能够在一个窗口中管理多个终端会话。这对于系统管理员、开发人员以及需要同时运行多个命令行任务的用户来说,极为方便。 一、安装 1、更新包 sudo a…

使用Selenium爬虫批量下载AlphaFold数据库中的PDB文件

注意&#xff1a;本方法使用了python&#xff0c;下载速度一般&#xff0c;如果需要更快的大批量下载可以考虑使用其他方法&#xff0c;例如FTP Alphafold数据库其实提供了许多物种的蛋白质组&#xff1a; AlphaFold Protein Structure Database 但是如果你搜索的物种不在这个…

算法面试leadcode【经典150道】

88 合并两个有序数组 方法一 使用arraycopy排序 * 思路一&#xff1a;将nums2合并到nums1的尾部&#xff0c;再直接进行排序。* 使用arraycopy(int[]nums1,int m,int[] nums2,int n)* 方法来进行排序&#xff0c;* 从原数组的哪个位置&#xff0c;移动到原数组的哪个位置&#…

xxl-job适配达梦数据库并制作镜像、源码部署xxl-job

背景&#xff1a;因项目需要信创&#xff0c;需将原本的mysql数据库&#xff0c;改成达梦数据库 一、部署达梦数据库 1.1 部署达梦数据库服务 可参考&#xff1a;Docker安装达梦数据库_达梦数据库docker镜像-CSDN博客 PS&#xff1a;部署达梦数据库时&#xff0c;需加上大小…

Java | Leetcode Java题解之第300题最长递增子序列

题目&#xff1a; 题解&#xff1a; class Solution {public int lengthOfLIS(int[] nums) {int len 1, n nums.length;if (n 0) {return 0;}int[] d new int[n 1];d[len] nums[0];for (int i 1; i < n; i) {if (nums[i] > d[len]) {d[len] nums[i];} else {int…

19. Revit API: Parameter(参数)

一、前言 我们在前面或多或少提到也用到参数了&#xff0c;这篇便细讲一下。 首先&#xff0c;我们知道好多信息都藏在参数里&#xff0c;或者说可以从参数中获取。我们还能够通过调整参数的值&#xff0c;改变模型的形态&#xff0c;即族的参变。 其次&#xff0c;有时族上…

【CAN通讯系列4】CAN通讯如何传递信号?

在【CAN通讯系列3】如何学习CAN通讯&#xff1f;中举了一个例子&#xff1a;新能源汽车要实现驱动功能&#xff0c;先需要整车控制器VCU计算目标转速或扭矩请求等信号&#xff0c;再通过CAN通讯传递给电机控制器MCU&#xff0c;就这个例子继续探讨CAN通讯的基础问题。 1 CAN数据…

入门 PyQt6 看过来(案例)08~ 页面布局

主题&#xff1a;学习页面布局控件以及布局容器的使用&#xff08;理论知识&#xff09; 1 布局控件 PyQt6的布局方式包括绝对布局、水平布局、垂直布局、网格布局和表单布局。 绝对布局&#xff1a;直接设置控件对象在参考坐标中的位置水平布局&#xff1a;对加入的控件对象从…

引用的项目“xxxx/tsconfig.node.json”可能不会禁用发出。

vue3 报错&#xff1a; 引用的项目“xxxx/tsconfig.node.json”可能不会禁用发出。 解决&#xff1a; 进入对应的 json 文件&#xff1a; 修改&#xff1a; "noEmit": false 当 noEmit 设置为 false 时&#xff0c;TypeScript 编译器将根据项目配置生成相应的输出文…

【数据结构初阶】单链表经典算法题十道(详解+图例)—得道飞升(终篇)

hi &#xff01; 目录 9、 环形链表 || 10、随机链表的复制 终章 9、 环形链表 || 【图解】 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; struct ListNode *detectCy…

Live800:客户服务中的情感智能,建立深厚客户关系的秘诀

在当今竞争激烈的市场环境中&#xff0c;客户服务已成为企业脱颖而出的关键因素之一。而情感智能&#xff0c;作为客户服务中的重要组成部分&#xff0c;更是建立深厚客户关系、提升客户满意度的秘诀所在。优秀的客户服务不仅关乎问题的解决&#xff0c;更在于情感的交流与共鸣…

物联网云盒多路开关量模拟量转无线MQTT钡铼技术S275

物联网云盒多路开关量模拟量转无线MQTT技术在现代工业自动化和远程监测中扮演着关键角色。钡铼第四代RTU S275作为一款先进的物联网数据监测采集控制短信报警终端&#xff0c;集成了多种先进技术和功能&#xff0c;旨在提升远程数据采集与控制的效率和可靠性。 钡铼第四代RTU …

在Ubuntu 12.10上安装和使用tmux的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 关于 tmux tmux 是一个终端复用工具。它允许您使用多个虚拟终端访问 tmux 终端。 tmux 利用了客户端-服务器模型&#xff0c;这使您可…

unity3d:TabView,UGUI多标签页组件,TreeView树状展开菜单

概述 1.最外层DataForm为空壳编辑数据用。可以有多个DataForm&#xff0c;例如福利DataForm&#xff0c;抽奖DataForm 2.Menu层为左边栏层&#xff0c;每个DataForm可以使用不同样式的MenuForm预制体 3.DataForm中使用ReorderList&#xff0c;可排列配置 4.有定位功能&#xf…

网址导航系统PHP源码分享

1、采用光年全新v5模板开发后台 2、后台内置8款主题色&#xff0c;分别是简约白、炫光绿、渐变紫、活力橙、少女粉、少女紫、科幻蓝、护眼黑 3、可管理无数引导页主题并且主题内可以进行不同的自定义设置&#xff0c;目前内置16套主题 持续增加中… 4、可单独开发各种插件&a…

【OSCP系列】OSCP靶机-LemonSqueezy(原创)

【OSCP系列】OSCP靶机-LemonSqueezy 原文转载已经过授权 原文链接&#xff1a;Lusen的小窝 - 学无止尽&#xff0c;不进则退 (lusensec.github.io) 一、主机发现 二、端口扫描 1、快速扫描 2、全端口扫描 只有一个80端口 3、版本系统探测 80端口http的apache服务&#xff0…

2年社招冲击字节,一天三面斩获offer

在工作满两年的时间选择了求变&#xff0c;带着运气和实力以社招身份重新看今天的互联网环境&#xff0c;从结果看还是复合预期的。 整个面试的流程还挺快的。周中让招聘专员给投递了简历。问什么时候面试&#xff0c;申请了一个周日&#xff0c;直接安排三面。下周周中就开启…

【神经网络】梯度下降的优化方法【数学公式+代码示例】

文章目录 1、简介2、指数加权平均2.1、公式2.2、代码 3、Momentum⭐3.1、公式演变3.2、代码 4、AdaGrad4.1、计算步骤4.2、代码示例 5、RMSProp5.1、公式5.2、代码5.3、小结 6、Adam6.1、公式和步骤解释⭐6.2、代码⭐6.3、优点 7、何为鞍点8、小结 &#x1f343;作者介绍&#…