精选文章 图像金字塔

图像金字塔

作者:物随心转 时间: 2020-08-22 07:12:03
物随心转 2020-08-22 07:12:03

一、为什么要使用图像金字塔?

在现实世界中,物体在不同尺度下,有着不同的结构。这就表明,我们如果从不同的尺度去观察同一个物体,会得出不一样的结果。比如,观察一棵树的适当尺度应该是“米”,而观察一片叶子可能需要更细粒度的尺度才能得出较好的结果。 当计算机系统要对一个未知的场景进行分析时,并不能够提前预知要用什么样的尺度来对图像信息中的兴趣结构(interesting structures)进行描述才是最合适的。因此,唯一可行的方案就是将多个不同尺度的描述都考虑进来,以便捕获未知的尺度变化。

举个例子,我们要在一幅图像中查找某个目标,比如脸,我们不知道目标在图像中的尺寸大小。这种情况下,我们需要创建创建一组图像,这些图像是具有不同分辨率的原始图像。如果我们把最大的图像放在底部,最小的放在顶部,看起来像一座金字塔,故而得名图像金字塔。(即同一图像的不同分辨率的子图集合)。

图像金字塔1

二、 金字塔类型:高斯和拉普拉斯

1、高斯金字塔(Gaussian pyramid):

用来向下采样,高斯金字塔的顶部是通过将底部图像中的连续的行和列去除得到的。要从金字塔第i层生成第i+1层(我们表示第i+1层为G_i+1),我们先要用高斯核对G_i进行卷积,然后删除所有偶数行和偶数列。这样操作一次一个MxN 的图像就变成了一个M/2xN/2 的图像。所以这幅图像的面积就变为原来图像面积的四分之一。这被称为Octave。连续进行这样的操作我们就会得到一个分辨率不断下降的图像金字塔。函数 cv2.pyrDown() 从一个高分辨率大尺寸的图像向上构建一个金子塔(尺寸变小,分辨率降低)

img = cv2.imread('messi5.jpg')
lower_reso = cv2.pyrDown(higher_reso)

下图是一个四层的图像金字塔

图像金字塔2

 

2、拉普拉斯金字塔(Laplacianpyramid)
: 用来从金字塔低层图像重建上层未采样图像,在数字图像处理中也即是预测残差,可以对图像进行最大程度的还原,配合高斯金字塔一起使用。先将图像在每个方向放大为原来的两倍,新增的行和列用0填充,再使用先前同样的内核与放大后的图像卷积,获得新增像素的近似值。

OpenCV代码

higher_reso2 = cv2.pyrUp(lower_reso)

 函数 cv2.pyrUp() 从一个低分辨率小尺寸的图像向下构建一个金子塔(尺寸变大,但分辨率不会增加)
拉普拉金字塔的图像看起来就像边界图,其中很多像素都是 0。他们经常被用在图像压缩中。下图就是一个三层的拉普拉斯金字塔:

图像金字塔3

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

图像金字塔4

 

 

三、实例

图像金字塔的一个应用是图像融合。例如,在图像缝合中,你需要将两幅图叠在一起,但是由于连接区域图像像素的不连续性,整幅图的效果看起来会很差。这时图像金字塔就可以排上用场了,他可以帮你实现无缝连接。这里的一个经典案例就是将两个水果融合成一个,看看下图也许你就明白我在讲什么了。

图像金字塔5

实现上述效果的步骤如下:
1. 读入两幅图像,苹果和橘子
2. 构建苹果和橘子的高斯金字塔(6 层)
3. 根据高斯金字塔计算拉普拉斯金字塔
4. 在拉普拉斯的每一层进行图像融合(苹果的左边与橘子的右边融合)
5. 根据融合后的图像金字塔重建原始图像。

import cv2
import numpy as np,sys
A = cv2.imread('apple.jpg')
B = cv2.imread('orange.jpg')

# generate Gaussian pyramid for A
G = A.copy()
gpA = [G]
for i in xrange(6):
G = cv2.pyrDown(G)
gpA.append(G)

# generate Gaussian pyramid for B
G = B.copy()
gpB = [G]
for i in xrange(6):
G = cv2.pyrDown(G)
gpB.append(G)

# generate Laplacian Pyramid for A
lpA = [gpA[5]]
for i in xrange(5,0,-1):
GE = cv2.pyrUp(gpA[i])
L = cv2.subtract(gpA[i-1],GE)
lpA.append(L)

# generate Laplacian Pyramid for B
lpB = [gpB[5]]
for i in xrange(5,0,-1):
GE = cv2.pyrUp(gpB[i])
L = cv2.subtract(gpB[i-1],GE)
lpB.append(L)

# Now add left and right halves of images in each
#numpy.hstack(tup)

#Take a sequence of arrays and stack them horizon
#to make a single array.

LS = []
for la,lb in zip(lpA,lpB):
rows,cols,dpt = la.shape
ls = np.hstack((la[:,0:cols/2], lb[:,cols/2:]
LS.append(ls)

# now reconstruct
ls_ = LS[0]
for i in xrange(1,6):
ls_ = cv2.pyrUp(ls_)
ls_ = cv2.add(ls_, LS[i])

# image with direct connecting each half
real = np.hstack((A[:,:cols/2],B[:,cols/2:]))
cv2.imwrite('Pyramid_blending2.jpg',ls_)
cv2.imwrite('Direct_blending.jpg',real)


 四、总结

关于图像金字塔非常重要的一个应用就是实现图像分割。图像分割的话,先要建立一个图像金字塔,然后在G_i和G_i+1的像素直接依照对应的关系,建立起”父与子“关系。而快速初始分割可以先在金字塔高层的低分辨率图像上完成,然后逐层对分割加以优化。

参考:

https://blog.csdn.net/zhu_hongji/article/details/81536820

 

勿删,copyright占位
分享文章到微博
分享文章到朋友圈

上一篇:美剧美句

下一篇:鲲鹏arm64 CentOS7 虚拟机学习

您可能感兴趣

  • 210道面试官必问经典面试题总结分享|Java+JVM+数据库+算法+Spring+中间件+设计模式超详细整理

    “金九银十”的秋招热潮已经来了,由于疫情影响、今年的秋招来的格外早。小编从今天六月份开始备战,不负众望的成功拿下了一些大厂的offer。经过这么多次的面试,凭借自己的面试成功经验和这两个月的准备,小编整理了一份面试清单分享给大家,希望能给和我一样为了秋招奋战多时的码农亲人们一点帮助(java方向),觉得有帮助的同学可以转发点个赞哦~~祝大家面试顺利,一举拿下大厂offer! 一、JAVA基础...

  • 【技术史】数据中台的前世今生

    数据中台自14年至今,已然成为了2B、2G业务最热门的话题,政府机构、企事业单位、互联网公司等进行着数字化、数据化、智能化转型。市场普遍认为,阿里巴巴将自身数据中台建设能力对外赋能是拉起本轮数据中台浪潮的根本所在。 本文将带你全面了解阿里巴巴做数据中台的历史。 1、缘起 在2014年以前,阿里巴巴有很多条业务线,都有自己的ETL团队,每个ETL团队建设和维护自己的数据体系。当时许多人认为,这...

  • 计算机必备专用英语词汇

    非常好的单词整理,转载一下当作笔记 1.单词说明:   command n. 命令,指令 [kə'mɑ:nd]   单词拼写 名词 单词含义 音标(发音)   提示:着重记忆单词对应的意思,有能力最好词性也记忆。 2.词性说明: n v vi vt conj prep pron adj adv 名词 动词 非及物动词 及物动词 连词 介词 代词 形容词 副词 3.单词列表: 1.file,n...

  • GPU端吊打RegNet、EfficientNet的强悍担当:GENet

    编辑:Happy 首发: AIWalker公众号 来源: GPU端精度最高速度最快的强悍担当:GENet 日期:2020-06-27 【Happy导语】该文是阿里巴巴提出了一种GPU端高效&高精度网路架构设计新方案。不同于之前的MobileNet、EfficientNet以及RegNet等网络采用相同的模块构建整个网络,该文对不同阶段的模块进行分析并得出这样的结论:在网络的low-level...

  • 转载:PCB设计大神的105个经验总结

    http://murata.eetrend.com/node/1001487 在电子产品设计中,PCB布局布线是最重要的一步,PCB布局布线的好坏将直接影响电路的性能。现在,虽然有很多软件可以实现PCB自动布局布线,但是随着信号频率不断提升,很多时候,工程师需要了解有关PCB布局布线的最基本的原则和技巧,这样才可以让自己的设计完美无缺,《PCB(印制电路板)布局布线100问》涵盖了PCB布局...

  • Java Lambda表达式

    点击上方“java大数据修炼之道”,选择“置顶或者星标” 你想要的优质技术好文第一时间送达! 来源 | http://tutorials.jenkov.com/java/lambda-expressions.html Java Lambda表达式是Java8中的新特性。Java lambda表达式是Java进入函数式编程的第一步。因此,Java lambda表达式是可以单独创建的函数,而无需...

  • 如何基于 Electron 开发跨终端的应用

    自我介绍 欢迎大家来到今天的早早聊跨端跨栈专场,今天我分享的主题是《如何基于 Electron 开发跨终端的应用》。先做一下自我介绍,我叫逯子洋,17 年加入政采云,目前主要负责政采云前端工程化平台敦煌以及政采云电子招投标客户端的建设。这边是我们团队的微信公众号,大家如果想对我们团队有更多的了解,可以关注一下我们的公众号。 首先我们分享的第一块叫端的延展。不知道大家对这张图熟不熟悉,前段时间...

  • 人工智能那么火~如今AI的应用场景都有哪些?

    作者:新智元 链接:https://www.zhihu.com/question/282715644/answer/1329782546 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 【未来5年AI应用报告】谷歌、DeepMind、英伟达科学家支招企业AI应用 ReWork的一份最新AI落地应用报告,阐述了企业该如何使用AI技术。谷歌的Ian GoodFe...

华为云40多款云服务产品0元试用活动

免费套餐,马上领取!
CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。