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 …

华为: 即将发布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…

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

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

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

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

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

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

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

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

OpenCV矩阵操作

矩阵类的成员函数可以进行很多基本的矩阵操作&#xff0c;在之前已经介绍过。除此之外&#xff0c;也有很多操作被表示为“友元”函数&#xff0c;它们的输入为矩阵类型&#xff0c;或者输出为矩阵类型&#xff0c;或者输入输出同为矩阵类型。下面将对这些函数及其参数进行详细…

关于机器意识的对话

来源&#xff1a; 人机与认知实验室S教授德高望重&#xff0c;建立了一个关于人工智能的微信群&#xff0c;吸引了很多关心人工智能的专业人士参与讨论。群中常有热烈的讨论。前些天恰好有一场关于机器意识的对话。感觉比较有意思&#xff0c;觉得放任这些讨论在微信群里被遗忘…

OpenCV绘图和注释

OpenCV的绘图函数可以在任意深度的图像上工作&#xff0c;但在大多数情况下&#xff0c;它们只对图像的前三个通道有影响BGR&#xff0c;如果是单通道图像&#xff0c;则默认只影响第一个通道。大多数绘图函数都支持操作对象的颜色、宽度、线型和亚像素对齐等参数。 艺术线条 …

012.对netmap API的解读

一.简要说明&#xff1a; 1.netmap API主要为两个头文件netmap.h 和netmap_user.h &#xff0c;当解压下载好的netmap程序后&#xff0c;在./netmap/sys/net/目录下&#xff0c;本文主要对这两个头文件进行分析。 2.我们从netmap_user.h头文件开始看起。 二.likely()和unlikely…

【学术笔记】探索大脑静息态活动中的动态信息

来源&#xff1a;脑科学2019年6月18日下午&#xff0c;来自加州大学河滨分校(The University of California, Riverside) Bourns工程学院的生物工程系主任Xiaoping Hu (胡小平)教授应北京大学麦戈文脑研究所方方老师的邀请来到北京大学&#xff0c;在王克桢楼1113室为老师和同学…

OpenCV中的函数子

随着OpenCV的发展&#xff0c;封装了越来越多的功能&#xff0c;而往往这些功能不是一个函数就能完成的&#xff0c;实现为一组函数又会导致整个库的函数变得杂乱无章&#xff0c;因此常常使用一个新的对象类型来实现这个新功能。通过重载operator()来生成对象或函数子。下面主…

查找会议论文的会议地址

有时候会议论文conference proceedings引用格式中要求出现会议地址&#xff0c;如下所示 查找会议地址的方法为直接搜索该会议论文&#xff0c;以ieee为例&#xff0c;会议地址信息在该论文的首页信息中&#xff1a; Conference Location: Arlington, VA, USA中的三项就分别对应…

OpenCV可移植图形工具HighGUI实现图像和视频操作

OpenCV把用于操作系统、文件系统以及摄像机等硬件设备交换的函数纳入了HighGUI&#xff08;High-level Graphical User Interface&#xff09;模块中。有了HighGUI模块&#xff0c;我们可以方便地打开窗口、显示图像、读出或写入图像相关的文件、鼠标事件和键盘事件。下面将对三…

华为内部深度解读,关于5G发展的28个核心问题

来源 | 腾讯深网关于5G技术动态与商用进展业界最关心的核心问题&#xff0c;华为5G产品线相关负责人近日对《深网》等进行了详细解读&#xff0c;以下是《深网》整理的问答实录&#xff1a;一、5G先进性与行业应用1. 5G到底是什么&#xff1f;和4G比有什么不一样&#xff1f;从…

OpenCV鼠标事件和滑动条事件

鼠标事件 ① 鼠标事件是通过传统的回调函数机制来完成。 void your_mouse_callback(int event, int x, int y, int flags, void* param) 其中&#xff0c;第一个参数要指明事件&#xff0c;第二个和第三个参数是鼠标事件的位置&#xff0c;第四个参数是标志位&#xff0c;第…

GSMA:中国有望成为全球领先的5G市场之一

来源&#xff1a;GSMA移动智库近日&#xff0c;GSMA&#xff08;全球移动通信协会&#xff09;发布首个《中国移动经济发展报告2019》。报告称&#xff0c;中国的移动生态系统在2018年为中国经济创造了5.2万亿元 (7,500亿美元) 的附加值&#xff0c;相当于2018年中国GDP的5.5%。…

canal —— 阿里巴巴mysql数据库binlog的增量订阅消费组件

阿里巴巴mysql数据库binlog的增量订阅&消费组件canal &#xff0c;转载自 https://github.com/alibaba/canal 最新更新 canal QQ讨论群已经建立&#xff0c;群号&#xff1a;161559791 &#xff0c;欢迎加入进行技术讨论。canal消费端项目开源: Otter(分布式数据库同步系统…