今天我们介绍图像处理邻域中比较常用的一种方法,image pyramid, 也叫图像金字塔。就是将图像进行一层一层的下采样,图像金字塔是为了构建图像的多尺度,让模型能够更好的适应图像的尺度变化,图像金字塔可以广泛应用于图像识别,目标检测,还有光流配准,块匹配都能看到它的身影。图像金字塔主要有两种,一种是高斯金字塔,gaussian pyramid,另外一种是拉普拉斯金字塔,Laplacian Pyramids。

G0=IG1=Down(G0∗F)G2=Down(G1∗F)⋅⋅⋅GN=Down(GN−1∗F)(3)(3)G0=IG1=Down(G0∗F)G2=Down(G1∗F)⋅⋅⋅GN=Down(GN−1∗F)

G_0 = I \\\qquad \qquad \qquad G_1 = Down(G_0 \ast F) \\ \qquad \qquad \qquad G_2 = Down(G_1 \ast F) \\ \cdot \cdot \cdot \\ \qquad \qquad \qquad \quad G_N = Down(G_{N-1} \ast F)

GkGkG_k 表示的每一层金字塔中的图像,FF F 表示高斯卷积核,∗∗ \ast 表示卷积操作,DownDownDown 表示下采样,上面的表达式,就可以构建一个图像金字塔。这个在 Open-CV 中有现成的函数,下面给出一段代码,看看高斯金字塔的构建:

    import numpy as npimport matplotlib.pyplot as pltA = cv2.imread('D:/Python_Code/Test_img/2.jpg')row, col, dpt = A.shapepyr_level = 4# generate Gaussian pyramid for AG = A.copy()gpA = [G]for i in range(pyr_level):G = cv2.pyrDown(G)gpA.append(G)G = np.zeros([row, col, dpt], dtype='uint8')rowX2 = row // 2colX2 = col // 2G[:rowX2, :colX2, :] = gpA[1]rowX4 = rowX2 // 2colX4 = colX2 // 2G[rowX2:rowX2+rowX4, colX2:colX2+colX4, :] = gpA[2]G[:rowX4, colX2:colX2+colX4, :] = gpA[2]rowX8 = rowX4 // 2colX8 = colX4 // 2G[rowX2+rowX4:rowX2+rowX4+rowX8, colX2+colX4:colX2+colX4+colX8,          :] = gpA[3]G[ :rowX8, colX2+colX4:colX2+colX4+colX8, :] = gpA[3]cv2.imshow("gau_pyr", G)

下面给出一个效果图:

下面看看,拉普拉斯金字塔,拉普拉斯金字塔其实是根据高斯金字塔计算得来的:

L0=G0−Up(G1∗F)L1=G1−Up(G2∗F)L2=G2−Up(G3∗F)⋅⋅⋅LN−1=GN−1−Up(GN∗F)LN=GN(4)(4)L0=G0−Up(G1∗F)L1=G1−Up(G2∗F)L2=G2−Up(G3∗F)⋅⋅⋅LN−1=GN−1−Up(GN∗F)LN=GN

L_0 = G_0 - Up(G_1 \ast F) \\L_1 = G_1 - Up(G_2 \ast F) \\ L_2 = G_2 - Up(G_3 \ast F) \\ \cdot \cdot \cdot \\ \qquad L_{N-1} = G_{N-1} - Up(G_{N} \ast F) \\ L_N = G_N \\

利用拉普拉斯金字塔,可以实现图像的重建,根据上面的表达式,我们可以得到:

GN−1≈LN−1+Up(LN)GN−2≈LN−2+Up(GN−1)⋅⋅⋅G1≈L1+Up(G2)G0≈L0+Up(G1)(6)(6)GN−1≈LN−1+Up(LN)GN−2≈LN−2+Up(GN−1)⋅⋅⋅G1≈L1+Up(G2)G0≈L0+Up(G1)

G_{N-1} \approx L_{N-1} + Up(L_N) \\ G_{N-2} \approx L_{N-2} + Up(G_{N-1}) \\ \cdot \cdot \cdot \\ G_{1} \approx L_1 + Up(G_2) \\G_{0} \approx L_0 + Up(G_1)

也就是说,把拉普拉斯金字塔层层上采样,再累加,就可以重建出最初的图像。下面给出一段代码:

    import cv2import numpy as npA = cv2.imread('D:/Python_Code/Test_img/2.jpg')pyr_level = 4# generate Gaussian pyramid for AG = A.copy()gpA = [G]for i in range(pyr_level):G = cv2.pyrDown(G)gpA.append(G)# generate Laplacian Pyramid for AlpA = [gpA[pyr_level -1 ]]for i in range(pyr_level - 1,0,-1):GE = cv2.pyrUp(gpA[i])L = cv2.subtract(gpA[i-1],GE)lpA.append(L)# Now add left and right halves of images in each levelLS = []for la,lb in zip(lpA,lpB):rows,cols,dpt = la.shapels = laLS.append(ls)# now reconstructls_ = LS[0]for i in range(1,pyr_level):ls_ = cv2.pyrUp(ls_)ls_ = cv2.add(ls_, LS[i])cv2.imwrite('Pyramid_blending2.jpg',ls_)

原图:

重建后的图:

Image Pyramid相关推荐

  1. main方法_错误: 在类 ZiFUChuan.Pyramid 中找不到 main 方法, 请将 main 方法定义为:

    错误: 在类 ZiFUChuan.Pyramid 中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args) 否则 Java ...

  2. Paper8:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

    Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition 还未读

  3. R语言ggplot2可视化:ggplot2可视化两个水平条形图(horizontal)、并设置两个条形图使用共享的X轴、使用类似population pyramid可视化的方式绘制共享X轴的水平条形图

    R语言ggplot2可视化:ggplot2可视化两个水平条形图(horizontal).并设置两个条形图使用共享的X轴.使用类似population pyramid可视化的方式绘制共享X轴的水平条形图 ...

  4. 【文本分类】Deep Pyramid Convolutional Neural Networks for Text Categorization

    ·阅读摘要:   本文提出了DPCNN(深度金字塔CNN)模型.在transformer.bert还没兴起的年代,模型越深效果越好,但是模型的复杂度会随着深度提升.粗略地说,DPCNN就是为了解决CN ...

  5. 人群密度估计--Generating High-Quality Crowd Density Maps using Contextual Pyramid CNNs

    Generating High-Quality Crowd Density Maps using Contextual Pyramid CNNs ICCV2017 针对人群密度估计问题,本文主要从 i ...

  6. 场景解析--Pyramid Scene Parsing Network

    Pyramid Scene Parsing Network CVPR2017 语义分割 https://github.com/hszhao/PSPNet 针对 FCN 中没有 context 信息,本 ...

  7. 目标检测--Feature Pyramid Networks for Object Detection

    CVPR2017 Feature Pyramid Networks for Object Detection https://arxiv.org/abs/1612.03144 Code will be ...

  8. 如何为Pyramid添加Middleware

    在pylons的文档中,有专门讲过如何添加自己的Middleware, 通过这些Middleware, 我们可以改变输入和输出.这也是WSGI(Web Server Gateway Interface ...

  9. maskrcnn用于目标检测_用于目标检测的池化渐进网络(Pooling Pyramid Network)

    用于目标检测的池化渐进网络(Pooling Pyramid Network) 题目: Pooling Pyramid Network for Object Detection 作者: Pengchon ...

  10. 奖牌分配/Median Pyramid Hard

    题目背景 有一个环形的围墙,围墙上有一些塔,每个塔中有一个守卫. 题目描述 现在要发给每个守卫一些奖章,第i个守卫需要P[i]个奖章.每个守卫自己的奖章必须都是不同种类的,而且相邻的两个守卫得到的奖章 ...

最新文章

  1. 如何定位并优化慢查询Sql
  2. python3 实现 websocket server 解决中文乱码
  3. python批量删除文件1001python批量删除文件_Python实现递归遍历文件夹并删除文件...
  4. 图像的评价指标之SSMI——结构相似性
  5. my_free mysql源代码_MySQL源代码管中窥豹(一)_MySQL
  6. Spring的AOP和IOC是什么?使用场景有哪些?Spring事务与数据库事务,传播行为,数据库隔离级别
  7. wpf 语音通话_WPF+WCF一步一步打造音频聊天室(三):语音聊天
  8. 【NET CORE微服务一条龙应用】第二章 配置中心使用
  9. 2016蓝桥杯省赛---java---B---2(生日蜡烛)
  10. 米酷影视v7.2.1影视电影网站管理系统源码修复版
  11. 面试: 华为综合测试
  12. 深度挖坑系列之三:人脸识别,角度空间,欧氏空间,margin
  13. 盘点5大高频移动端场景,你不会用就落后了(内附模板下载)
  14. 红米k40和红米k40pro的区别 哪个好
  15. 什么是交互设计?交互设计是做什么的?
  16. PCI DSS安全评估简介
  17. 瑞士名表排名介绍及手表品牌识别
  18. Linux运维课程 第一阶段 重难点摘要(二)网络基础
  19. 机房布线网络布线之常用兵器谱
  20. “破晓之战”星杯传说赛后复盘分析

热门文章

  1. stg分区边界值问题
  2. python polygon_在Python中将Multipolygon转换为Polygon - python
  3. CF 183(div2)
  4. 女人最该记得的100本书的100句话
  5. 读书笔记软件调试之道 :问题的核心-诊断
  6. 线性回归(Linear Regression)和最小二乘法(ordinary least squares)
  7. 数据库原理及MySQL应用 | 数据库安全加固
  8. 小说《肖申克的救赎》的优秀读后感2600字
  9. 通过百度地图模糊查询获取详细地址?正则匹配
  10. 用Carbide C++ UI Designer做UI的爽与不爽