【C++】高斯金字塔和拉普拉斯金字塔原理和实现

图像中各个像素与其相邻像素之间的有很强的相关性,包含的信息也十分丰富,目标的尺寸有大有小,对比度有强有弱,此时就需要一个“显微镜”或者“望远镜”-----多尺度图像技术。它可以在不同分辨率下观察目标的特征进而进行处理。

多尺度图像技术也叫做多分辨率技术(MRA),指对图像采用多尺度的表达,并且在不同尺度下分别进行处理。这样做的理由是很多情况下在一种尺度中不容易看清的或者获取的特性在另外的某种尺度下就很容易发现或者是提取。所以多尺度技术在提取图像特征时更加的常用。要在多尺度情况下对图像进行处理首先要在多尺度情况下对图像进行表达,并且找到各尺度之间的相互联系。而金字塔结构就是一种图像的多尺度表达形式。为了获得多尺度表达所采用的多尺度变换技术基本上可以分为三大类,尺度空间技术,时间尺度技术,时间频率技术。

1. 图像金字塔

图像金字塔是一种以多分辨率来解释图像的结构,通过对原始图像进行多尺度像素采样的方式,生成N个不同分辨率的图像。把具有最高级别分辨率的图像放在底部,以金字塔形状排列,往上是一系列像素(尺寸)逐渐降低的图像,一直到金字塔的顶部只包含一个像素点的图像,这就构成了传统意义上的图像金字塔。

通过上采样和下采样实现图像金字塔,即对源图像的尺寸进行放大或者缩小变换。在opencv里面可以用resize函数,将源图像精准地转化为指定尺寸的目标图像。要缩小图像,一般推荐使用CV_INETR_AREA(区域插值)来插值;若要放大图像,推荐使用CV_INTER_LINEAR(线性插值)。这个函数可以用来做简单的图像尺度变换。

void resize(src,dst,size,int interpolation)
//src:源图像;dst:目标图像,
//size目标图像大小,可以是指定的尺寸或者放大缩小的比例
//指定插值方式,一般有四种插值方式可供选择,默认为线性插值法

图像金字塔效果如下:


2. 高斯金字塔

高斯金字塔(Gaussian pyramid): 通过高斯滤波和下采样获得一系列图像。相比于上面简单的下采样图像金字塔,高斯金字塔每一层都需要进行一次高斯滤波。通过使用不同的δ来调节高斯滤波器的频带宽度,得到经过不同高斯滤波器相同尺寸的同一组高斯金字塔。

当图像向金字塔的上层移动时,尺寸和分辨率就降低。OpenCV中,从金字塔中上一级图像生成下一级图像的可以用PryDown。而通过PryUp将现有的图像在每个维度都放大两倍。
上采样:pyrUp()函数

void pyrUp(InputArray src, OutputArray dst, const Size& dstsize=Size());

上采样效果图如下:



下采样:pyrDown()函数

void pyrDown(InputArray src, OutputArray dst, const Size& dstsize=Size());

高斯金字塔效果图如下:


3. 拉普拉斯金字塔

拉普拉斯金字塔(Laplacian pyramid): 用来从金字塔低层图像重建上层未采样图像,在数字图像处理中也即是预测残差,可以对图像进行最大程度的还原,配合高斯金字塔一起使用。我们可以将拉普拉斯金字塔理解为高斯金字塔的逆过程形式。

拉普拉斯金字塔的计算过程是通过源图像减去先缩小后再放大的图像,可以直接用OpenCV进行拉普拉斯运算:


拉普拉斯效果图如下:



将拉普拉斯金字塔逐层上采样累加重构后的效果图如下:

C++和opencv代码实现:

#include "iostream"
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;void Gaussian_Pyramid(Mat &image, vector<Mat> &pyramid_images, int level);
void Laplaian_Pyramid(vector<Mat> &pyramid_images, Mat &image);
void reconstuction(int level);int main(int argc, char** argv)
{Mat src = imread("Curry.jpg");/*copyMakeBorder(src, src, 0, 3, 0, 3, BORDER_REPLICATE);*/imshow("01", src);/*resize(src, src, Size(src.cols *4, src.rows *4));*//*cvtColor(src, src, COLOR_BGR2GRAY);*/vector<Mat> p_images;const int layer = 3; //金字塔层数Gaussian_Pyramid(src, p_images, layer - 1);Laplaian_Pyramid(p_images, src);reconstuction(layer - 1);//从拉普拉斯金字塔恢复原图waitKey();return 0;}void Gaussian_Pyramid(Mat &image, vector<Mat> &pyramid_images, int level) {Mat temp = image.clone();Mat dst;char buf[64];for (int i = 0; i < level; i++) {pyrDown(temp, dst);imshow(format("pyramid_up_%d", i), dst);sprintf_s(buf, "./result/gaussian_%d.jpg", i);imwrite(buf, dst);temp = dst.clone();pyramid_images.push_back(temp);}
}void Laplaian_Pyramid(vector<Mat> &pyramid_images, Mat &image) {int num = pyramid_images.size() - 1;imwrite("./result/laplacian_0.jpg", pyramid_images[num]);imshow("laplacian_0.jpg", pyramid_images[num]);for (int t = num; t > -1; t--) {Mat dst;char buf[64];if (t - 1 < 0) {pyrUp(pyramid_images[t], dst, image.size());subtract(image, dst, dst);// dst = dst + Scalar(127, 127, 127);sprintf_s(buf, "./result/laplacian_%d.jpg", num - t + 1);imshow(buf, dst);imwrite(buf, dst);}else {pyrUp(pyramid_images[t], dst, pyramid_images[t - 1].size());subtract(pyramid_images[t - 1], dst, dst);// dst = dst + Scalar(127, 127, 127);sprintf_s(buf, "./result/laplacian_%d.jpg", num - t + 1);imshow(buf, dst);imwrite(buf, dst);}}
}void reconstuction(int level) {char buf[64];Mat dst = imread("./result/laplacian_0.jpg");Mat dst2 = imread("./result/laplacian_1.jpg");Mat dst3 = imread("./result/laplacian_2.jpg");pyrUp(dst, dst);Mat dst4 = dst + dst2;pyrUp(dst4, dst4);Mat dst5 = dst4 + dst3;imshow("dst", dst5);
}

【C++】高斯金字塔和拉普拉斯金字塔原理和实现相关推荐

  1. python金字塔_高斯金字塔与拉普拉斯金字塔的原理与python构建

    高斯金字塔和拉普拉斯金字塔[1]在图像相关领域应用广泛,尤其是图像融合和图像分割方面.本文从理论和opencv实现两个方面对两种金字塔进行了介绍,并给出了二者的视觉效果. 1.高斯金字塔 在计算机视觉 ...

  2. 【OpenCV新手教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放...

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨) ...

  3. 【OpenCV入门教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨) ...

  4. 【笔记】高斯金字塔和拉普拉斯金字塔:高斯金字塔持续的下采样让图片变小,像素变少,特征模糊;拉普拉斯金字塔以记录恢复原图过程中的上采样后图片与原始图片的损失,力图还原真实图片

    高斯金字塔和拉普拉斯金字塔应用在图像融合和图像分割方面. def laplacian(gaussian_pyramid, up_times=5):laplacian_pyramid = [gaussi ...

  5. 图像金字塔:高斯金字塔vs拉普拉斯金字塔

    文章目录 一.图像金字塔的定义 二.高斯金字塔的计算 三.拉普拉斯金字塔的计算 一.图像金字塔的定义 图像金字塔是图像中多尺度表达的一种,用多分辨率来解释图像. 金字塔的底部是待处理图像的高分辨率表示 ...

  6. opencv学习-高斯金字塔和拉普拉斯金字塔

    图像金字塔 一个图像金字塔是由一系列的图像组成,最底下一张是图像尺寸最大,最上方的图像尺寸最小,从空间上从上向下看就像一个古代的金字塔. 金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似 ...

  7. 高斯金字塔和拉普拉斯金字塔实现图像融合

    相关笔记 高斯金字塔: repeat{ 1.对图像进行高斯滤波(平滑化): 2.抛除偶数行和列,依次缩小图片尺寸. // 每进行一轮循环,得到一层金字塔,每层金字塔图像大小都是上一层的一半. // 该 ...

  8. 高斯拉普拉斯 java_基于能量匹配的高斯金字塔与拉普拉斯金字塔图像融合

    利用拉普拉斯对高频信息的保留,重建出原始图像 操作过程如下 对于两张图像 可以看到两张同样的图片一个脸部模糊一个除了脸其他地方模糊,现在我们需要通过局部能量匹配的融合方法对图像进行增强,即基于能量特征 ...

  9. 图像金字塔、高斯金字塔、拉普拉斯金字塔是怎么回事?附利用拉普拉斯金字塔和高斯金字塔重构原图的Python-OpenCV代码

    图像金字塔是通过多个分辨率表示图像的一种有效且简单的结构. 一个图像金字塔是一系列以金字塔形状排列的分辨率逐步降低的图像.图像金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率表示. 图像金字塔 ...

最新文章

  1. [Ruby]转载: 关于ruby中 %Q, %q, %W, %w, %x, %r, %s 的用法
  2. eclipse部署android开发环境
  3. Xamarin.Forms客户端第一版
  4. 最小生成树——Kruskal(克鲁斯卡尔)算法
  5. SharePoint 2013开发入门探索(一)- 自定义列表
  6. 【POJ - 3020】Antenna Placement (匈牙利算法,二分图最小边覆盖)
  7. 打CALL APP 项目进展 总体计划
  8. PL/SQL第三课(学习笔记)
  9. SpringCloud工作笔记086---SpringBoot启动报错:No active profile set, falling back to default profiles
  10. python简单绘图代码-python绘图代码
  11. 华为emui3.1 android,华为EMUI3.1
  12. Python实现简单人脸识别
  13. win10怎么将计算机放桌面壁纸,windows10自带壁纸在哪里_win10电脑自带的桌面壁纸保存在哪...
  14. 日系插画学习笔记(十一):日系插画标准上色流程
  15. python中如何画出决策树_python画决策树
  16. 计算机读不出来u盘装系统,细说电脑重装系统u盘读不出怎么办
  17. 移动信号e经常无服务器,手机信号从4G变成E,是什么情况?移动客服作出解答...
  18. SpringBoot电商项目之购物车下单(沙箱支付)
  19. 恭喜!公积金将按月提取!12月31日前,全面执行!
  20. 蛙蛙推荐:蛙蛙教你文本聚类 - 蛙蛙王子 - 博客园

热门文章

  1. Happens-Before原则深入解读
  2. 青岛场・基于RT-Thread嵌入式操作系统的教学研讨交流会
  3. Proxmark​​​​​​​3介绍
  4. python stacking_详解 Stacking 的 python 实现
  5. 苹果电脑安装win11双系统
  6. 缺乏长线思考是扼杀工程师前途的屠刀.
  7. JS/Jquery常用代码
  8. vivado wdb文件 matlab,fft_ex1 基于verilog的FFT设计,使用vivado作为开发平台 VHDL-FPGA- 274万源代码下载- www.pudn.com...
  9. t2021121002回文
  10. Python机器学习库