OpenCV图像金字塔

图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。如下图所示。

常用的图像金字塔有高斯金字塔(Gaussian pyramid)和拉普拉斯金字塔(Laplacian pyramid)。高斯金字塔用来向下采样,而拉普拉斯金字塔用来从金字塔低层图像重建上层未采样图像。

高斯金字塔

下采样pyrDown

下采样,也叫做降采样,这个过程中是隔行隔列删去图像中的对应行和列,这样原图中那些精细的细节边缘等地方会变得锯齿状,产生失真,因此为了缩小之后的图像看起来自然,必须进行平滑。因此pyrDown函数在降采样之前要先对图像进行高斯模糊。此时采用的高斯核如下:

 代码:

#include "stdafx.h"
#include <opencv2/opencv.hpp>int main()
{// 声明两个图像矩阵cv::Mat img1, img2;// 创建两个窗口cv::namedWindow("image1", cv::WINDOW_AUTOSIZE);cv::namedWindow("image2", cv::WINDOW_AUTOSIZE);// 读取文件,并将原始图像显示在image1窗口img1 = cv::imread("test.jpg");cv::imshow("image1", img1);// 对原始图像进行下采样和高斯滤波处理,长宽各缩小一半,并显示在imge2窗口cv::pyrDown(img1, img2);cv::imshow("image2", img2);// 等待键盘事件cv::waitKey(0);// 关闭所有窗口,并释放关联内存cv::destroyAllWindows();return 0;
}

运行结果:

上采样pyrUp

上采样过程首先是将图像在每个方向上扩大为原来的两倍,新增的行和列都以0填充,然后使用下采样时用的高斯核乘以四与放大后的图像进行卷积,获得“新增像素”的近似值。因此处理后的图像尺寸变大,但是分辨率不变。

代码:

#include "stdafx.h"
#include <opencv2/opencv.hpp>int main()
{// 声明两个图像矩阵cv::Mat img1, img2;// 创建两个窗口cv::namedWindow("image1", cv::WINDOW_AUTOSIZE);cv::namedWindow("image2", cv::WINDOW_AUTOSIZE);// 读取文件,并将原始图像显示在image1窗口img1 = cv::imread("test.jpg");cv::imshow("image1", img1);// 对原始图像进行下采样和高斯滤波处理,长宽各放大一半,并显示在imge2窗口cv::pyrUp(img1, img2);cv::imshow("image2", img2);// 等待键盘事件cv::waitKey(0);// 关闭所有窗口,并释放关联内存cv::destroyAllWindows();return 0;
}

运行结果:

拉普拉斯金字塔

拉普拉斯金字塔可以有高斯金字塔计算得来,公式如下:

L_{i}=G_{i}-Up(G_{i+1})\bigotimes \kappa _{5\times 5}=G_{i}-PyrUp(G_{i+1})

式中: G_{i} 代表第i层高斯图像;

            G_{i+1} 代表第i+1层高斯图像;

            Up 代表上采样;

            \bigotimes  代表卷积运算符;

            \kappa _{5\times 5} 代表5 × 5的卷积内核。

拉普拉金字塔的图像看起来就像边界图,其中很多像素都是 0,经常被用在图像压缩中。

代码:

#include "stdafx.h"
#include <opencv2/opencv.hpp>int main()
{// 声明两个图像矩阵cv::Mat img1, img2, img3;// 创建两个窗口cv::namedWindow("image1", cv::WINDOW_AUTOSIZE);cv::namedWindow("image2", cv::WINDOW_AUTOSIZE);// 读取文件,并将原始图像显示在image1窗口img1 = cv::imread("test.jpg");cv::imshow("image1", img1);// 对原始图像进行下采样和高斯滤波处理,长宽各放大一半,并显示在imge2窗口cv::pyrDown(img1, img2);cv::pyrDown(img2, img3);cv::pyrUp(img3, img3);img3 = img2 - img3;cv::imshow("image2", img3);// 等待键盘事件cv::waitKey(0);// 关闭所有窗口,并释放关联内存cv::destroyAllWindows();return 0;
}

运行结果:

金字塔图像融合

分析:

① 首先通过图1建立高斯金字塔;

② 然后通过得到的高斯金字塔生成拉普拉斯金字塔。以图1、图2和图4为例:图4是公式中的L_{i},图1是公式中的G_{i},图2是公式中的G_{i+1},则图4是由图1减去图2向上采样并高斯模糊的结果得到的。

③ 因为拉普拉斯图像是用来从金字塔低层图像重建上层未采样图像的,所以可以通过将其与上一层的上采样的结果相加来重建原图。以图4、图5和图6为例:图6=图4+pyrUp(图5)。

注:重建原图金字塔的塔顶和高斯金字塔的塔顶是一样的。

代码:

注:这里选取的图片最好是大小相同,且行数和列数是能除尽2的6次方的值,否则上采样后的行数和列数可能和原来的相差1,需再进行处理。

#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <iostream>int main()
{// 声明两个图像矩阵cv::Mat img1, img2;// 读取图片img1 = cv::imread("apple.jpg");img2 = cv::imread("orange.jpg");// 创建三个窗口cv::namedWindow("img1", cv::WINDOW_NORMAL);cv::namedWindow("img2", cv::WINDOW_NORMAL);cv::namedWindow("img", cv::WINDOW_NORMAL);// 用apple图像生成高斯金字塔,共7层cv::Mat gp1[7];cv::Mat gtmp1 = img1;gp1[0] = gtmp1;for (int i = 1; i < 7; i++) {cv::pyrDown(gtmp1, gtmp1);gp1[i] = gtmp1;}// 用orange图像生成高斯金字塔,共7层cv::Mat gp2[7];cv::Mat gtmp2 = img2;gp2[0] = gtmp2;for (int i = 1; i < 7; i++) {cv::pyrDown(gtmp2, gtmp2);gp2[i] = gtmp2;}// 用apple图像生成拉普拉斯金字塔,共6层cv::Mat lp1[7];cv::Mat ltmp1;lp1[6] = gp1[6];for (int i = 5; i >= 0; i--) {cv::pyrUp(gp1[i+1], ltmp1);cv::subtract(gp1[i], ltmp1, lp1[i]);}// 用orange图像生成拉普拉斯金字塔,共6层cv::Mat lp2[7];cv::Mat ltmp2;lp2[6] = gp2[6];for (int i = 5; i >= 0; i--) {cv::pyrUp(gp2[i+1], ltmp2);cv::subtract(gp2[i], ltmp2, lp2[i]);}// 将apple拉普拉斯金字塔的左半边和orang拉普拉斯金字塔的右半边拼接,生成融合后的拉普拉斯金字塔cv::Mat LS[7];for (int i = 0; i < 7; i++) {cv::Size shape = lp1[i].size();int width = shape.width;// 将apple拉普拉斯图像赋给融合图像LS[i] = lp1[i];// 获取orange拉普拉斯图像的右半边取出cv::Mat roi2 = lp2[i].colRange(width / 2, width);// 将取出的半边图像复制到融合图像的右半边,实现图像融合roi2.copyTo(LS[i].colRange(width/2, width));}// 重建原图cv::Mat ls_ = LS[6];for (int i = 5; i >= 0; i--){cv::pyrUp(ls_, ls_);std::cout << ls_.size() << std::endl;std::cout << LS[i].size() << std::endl;cv::add(ls_, LS[i], ls_);}// 显示原图和重建图像cv::imshow("img1", img1);cv::imshow("img2", img2);cv::imshow("img", ls_);// 等待键盘事件cv::waitKey(0);// 关闭窗口,并释放相关联的内存cv::destroyAllWindows();return 0;
}

运行结果:

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

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

相关文章

带你深入理解图灵机--天才所在的时代

来源&#xff1a;人机与认知实验室这几年由于区块链的大热&#xff0c;以太坊独特的solidity语言实现智能合约功能&#xff0c;图灵完备这个词走进大家的视线。没有计算机专业知识的同学其实很难理解这个词的意思&#xff0c;其实计算机专业的同学都没有深入理解图灵机&#xf…

用PyMC3进行贝叶斯统计分析(代码+实例)

问题类型1&#xff1a;参数估计 真实值是否等于X&#xff1f; 给出数据&#xff0c;对于参数&#xff0c;可能的值的概率分布是多少&#xff1f; 例子1&#xff1a;抛硬币问题 硬币扔了n次&#xff0c;正面朝上是h次。 参数问题 想知道 p 的可能性。给定 n 扔的次数和 h …

2015总结及2016计划

2015计划完成情况&#xff1a; 1.网站建起来&#xff08;未完成&#xff09; 2.发布一款游戏&#xff08;cocos2dx或u3d&#xff09;&#xff08;未完成&#xff09; 3.稳定一年工作&#xff08;完成&#xff09; 4.学习C或C&#xff0c;能够使用其中一种进行windows编程&#…

华为: 即将发布5G+VR的颠覆式智能眼镜

来源&#xff1a;VR每日必看6月27日MWC19上海期间&#xff0c;华为手机业务总裁何刚在全球终端峰会发表演讲&#xff0c;提及华为终端在5G时代的全场景战略是“18N”。“1”就是华为手机&#xff0c;“8”则囊括了TV、平板、PC、耳机、车机、手表、眼镜、音响八项终端产品&…

OpenCV的数据类型——基础数据类型

OpenCV有很多数据类型&#xff0c;从组织结构的角度来看&#xff0c;OpenCV的基础类型类型主要分为三类。第一类是直接从C原语中继承的基础数据类型&#xff1b;第二类是辅助对象&#xff1b;第三类是大型数据类型。本文主要介绍OpenCV的基础数据类型。 目录 Point类 Scalar…

Process finished with exit code -1073741819 (0xC0000005)

运行TensorFlow出现如下错误&#xff0c;尝试了很多网上的方法都不行&#xff0c;最后把代码中的中文路径改为英文后就解决了

LeetCode - Partition List

题目&#xff1a; Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x. You should preserve the original relative order of the nodes in each of the two partitions. For example, Given 1-…

Cell:重大突破!三位学术大咖,打造全新“DNA显微镜”

来源&#xff1a;中国生物技术网传统上&#xff0c;科学家们使用光、X射线和电子来观察组织和细胞的内部。如今&#xff0c;科学家们能够在整个大脑中追踪线状的神经纤维&#xff0c;甚至可以观察活的小鼠胚胎如何产生原始心脏中的跳动细胞。但是这些显微镜无法看到的是&#x…

OpenCV的数据类型——辅助对象

在上一篇文章中&#xff0c;主要介绍了OpenCV的基础数据类型。接下来在本篇文章中将主要对OpenCV的辅助对象进行介绍。 cv::TermCriteria类 在很多算法中都存在着循环嵌套&#xff0c;只有满足终止条件时才会退出。通常情况下&#xff0c;终止条件的形式要么是达到允许的有限…

概率密度函数某一点的意义

在连续型随机变量的概率密度函数中&#xff0c;某一点的值不等于该点的概率值&#xff0c;就像不能计算汽车在某一点的速度&#xff0c;因为速度是距离除以时间&#xff0c;对某一点来说不存在距离的概念。如果要计算某一点x的概率的话&#xff0c;就要对x取邻域&#xff08;无…

eclipse中monokai插件的安装

eclipse中monokai插件的安装转载于:https://www.cnblogs.com/zhujiabin/p/5099675.html

Science Robotics近日刊登CMU重大突破,无需手术,普通人就能用意念操控机械臂!...

来源&#xff1a;机器人大讲堂导读顶尖学术期刊《科学》旗下的Science Robotics本月19号刊登了脑机接口&#xff08;BCI&#xff09;领域的一项突破成果。美国卡内基梅隆大学的贺斌教授带领其研究团队与明尼苏达大学合作&#xff0c;成功开发出第一款非侵入式的意念控制机械臂&…

使用pymc3可能遇到的问题及解决方法

PyMC3机器学习库&#xff0c;基于heano, NumPy, SciPy, Pandas, 和 Matplotlib。 安装 pip install pymc3&#xff0c;pip命令可以安装pymc3并安装其依赖库 首次运行报错 这可能是缺少某些依赖库导致的&#xff0c;根据报错信息安装即可 运行出现一长串c代码&#xff0c;或…

【采药.】

采药 题目链接 题意 在这规定时间内采摘草药&#xff0c;使得获得的草药总价值最大&#xff08;动态规划&#xff09; 思路 初始化数组并输入动态规划输出 坑点 容易忘记初始化 算法一&#xff1a;动态规划 时间复杂度 O(n * T) 实现步骤 输入动态规划输出 代码 #include…

OpenCV的工具函数

OpenCV3也提供了一些经常用于计算机视觉的实用功能&#xff0c;列举如下: 功能描述cv::alignPtr() Align pointer to given number of bytes 对齐指针到指定字节数 cv::alignSize() Align buffer size to given number of bytes 将缓存区大小与给定的字节数对齐 cv::allocate(…

一文读懂全球自动驾驶传感器市场格局!

来源&#xff1a;智驾未来自动驾驶汽车作为汽车未来的重要发展方向&#xff0c;成为汽车零部件产业链的重要增长点。国内外的汽车零部件供应商积极布局自动驾驶传感器领域&#xff0c;在车载摄像头、毫米波雷达和激光雷达三大核心部件&#xff0c;以及产业链上下游的拓展为零部…

林志玲为何无法拯救都市丽人的遇冷?

6月11日&#xff0c;恰是备受瞩目的内衣股都市丽人的赴港推介会。公司董事长郑耀南携手林志玲在会上宣布。从6月16日起招股募资近18亿港元。26日将在联交所主板挂牌上市。而作为“在中国最了解女人的男人”的郑耀南。出于赴港上市造势须要&#xff0c;这次请来了都市丽人品牌代…

Chrome划词翻译插件

https://saladict.crimx.com/ 沙拉查词&#xff0c;同时支持几种翻译软件的翻译结果&#xff0c;实现网页划词划句即时翻译

OpenCV的数据结构——大型数组类型

OpenCV中的数据类型可分为三类&#xff0c;而前两类&#xff08;基础数据类型和辅助对象&#xff09;在前面已进行详细讲述&#xff0c;下面将对最后一种——大型数组类型进行讲解。 大型数据类型中最重要的当属cv::Mat&#xff0c;这可谓是OpenCV的核心&#xff0c;所有主要函…

MIT对话马斯克:关于自动驾驶、爱和未来世界|厚势汽车

来源&#xff1a;价值中国编译不论是在新能源汽车、私人航空航天、共通交通、还是在人工智能领域&#xff0c;埃隆马斯克天马行空的创想和脚踏实地的奋斗让人震惊不已。简直就是一个活着得的非物质文化遗产。马斯克在全球范围内收割了无数粉丝。不论是企业家、工程师、科技研究…