精选文章 图像金字塔

图像金字塔

作者:物随心转 时间: 2021-02-05 09:38:23
物随心转 2021-02-05 09:38:23
【摘要】一、为什么要使用图像金字塔? 
在现实世界中,物体在不同尺度下,有着不同的结构。这就表明,我们如果从不同的尺度去观察同一个物体,会得出不一样的结果。比如,观察一棵树的适当尺度应该是“米”,而观察一片叶子可能需要更细粒度的尺度才能得出较好的结果。 当计算机系统要对一个未知的场景进行分析时,并不能够提前预知要用什么样的尺度来对图像信息中的兴趣结构(interesting structures)进...

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

在现实世界中,物体在不同尺度下,有着不同的结构。这就表明,我们如果从不同的尺度去观察同一个物体,会得出不一样的结果。比如,观察一棵树的适当尺度应该是“米”,而观察一片叶子可能需要更细粒度的尺度才能得出较好的结果。 当计算机系统要对一个未知的场景进行分析时,并不能够提前预知要用什么样的尺度来对图像信息中的兴趣结构(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 虚拟机学习

下一篇:小程序开发 总结 (触摸穿透、数据统计、扫码、缓存、text组件)

您可能感兴趣

  • 使用IPicture的OLE实现读取和显示BMP,GIF,JPG,ICO,EMF,WMF图像

    作者的话:GDI+看起来是更好的解决方案,但是IPicture的OLE实现更简单。 问题的起源很久以来,我都被一个问题困扰。关于程序中显示图像的问题,我在网络上搜索了很长时间,找到了无数的解决方案,比如分析文件格式,直接读取文件的;用控件的(柯达的ImgEdit控件);以及不知道内部实现方法的库(ImageLoad)。而我找到的方法大都不容易使用,特别是那些直接按位读取图像的。很多时候我不得...

  • 通过Adodb.Stream取得图像(BMP JPG PNG GIF SWF)的高度和宽度

    上传图片或显示SWF的时候都希望得到它的高度和宽度 基本原理使用Adodb.Stream读二进制文件然后进行解析,然后返回一数组第一个元素为类型(BMP JPG PNG GIF SWF)第二个元素为宽度{width}第三个元素为高度{height}第四个元素为width={width},height={height}式字符串 Class qswhImg dim aso Private Sub...

  • 使用Sample Grabber过滤器扑获图像

    Sample Grabber过滤器是一个可以被插入流的过滤器,它有自己的缓冲,存放采样。 如果你想从一个视频文件中简单的扑获一桢,那么我建议你使用Media Detector对象。Sample Grabber提供了更复杂的更灵活的控制。我们通过下面的步骤使用Sample Grabber过滤器: 1、  指定你想要扑获的媒体类型 在Sample Grabber 过滤器连接到别的过滤器之前你必须...

  • SQL Server存储图像数据的策略与方法

    目前对于图像数据的管理大都采用表+实体的方法,即图像数据以文件形式存放于指定的计算机目录下,在 数据库表中只反映图像数据文件的存储路径。这种管理模式,给数据的维护增加了难度,同时,也给数据的安全带来一定的隐患。因此,要真正做到各类数据在 数据库中安全管理,研究和探索直接将图像数据存储在 数据库关系表中的方法是非常必要的。   笔者在Visual Basic 6.0开发环境中,采用客...

  • 使用C#从数据库读取图像二进制流的代码

    工作需要,要判断一个老的数据库中image存放的数据类型,写了一段代码,放在这里供大家参考。除数据库部分需要大家修改一下以外,其它全部调试正常。里面有意思的是省却了connection的close方法,而用了另一种方式取代,希望大家能注意一下。 using System; using System.Drawing; using System.Collections; using System...

  • opencv复制图像

    IplImage *pyr; //声明IplImage指针    pyr=new IplImage; CvSize size = cvSize(800,600); // get current frame size int p_w_picpath_width_bits = 800*3;  cvInitImageHeader(pyr, size, 8, 3,IPL_ORIGIN_BL, 4);...

  • 图像频域变换之前言

    突然发现几年之前为某图像网站写的一个专题文章 现在发出来--为留个底稿吧 呵呵   第二期 图像频域变换 本期编辑: 德鲁伊   喜欢上的时候就会去研究它,研究之后更加喜欢它--- -----My Digital Image Processing   写在本期前:我不是研究图像多年的大师,也没有研究图像很多年,只是一个对图像很感兴趣的小小分子,下面是我做的在线期刊第二期-------图像频域...

  • latex的两栏论文中插入一栏并排图像

    还是wikipedia有用,在这里。 具体的是: usepackage{subfig}begin{figure}centeringsubfloat[A gull]{label{fig:gull}includegraphics[width=0.3textwidth]{gull}} subfloat[A tiger]{label{fig:tiger}includegraphics[wid...

CSDN

CSDN

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

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

免费套餐,马上领取!
图像金字塔介绍:华为云为您免费提供图像金字塔在博客、论坛、帮助中心等栏目的相关文章,同时还可以通过 站内搜索 查询更多图像金字塔的相关内容。| 移动地址: 图像金字塔 | 写博客