Skip to content

Latest commit

 

History

History
107 lines (73 loc) · 4.33 KB

3-8.影像金字塔.md

File metadata and controls

107 lines (73 loc) · 4.33 KB

http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_pyramids/py_pyramids.html

本节目标

我们将学习图像金字塔
我们将使用图像金字塔创建一个新的水果,“Orapple”
我们将看到这些功能:cv2.pyrUp(), cv2.pyrDown()

Theory(原理)

通常,我们使用恒定大小的图像。但在某些情况下,我们需要在同一幅图像的不同分辨率图像的工作。例如,在搜索图像中的某个物体时,比如人脸,我们不能确定物体在图像中的大小。在这种情况下,我们将需要创建一组不同分辨率的图像,并在所有的图像中搜索对象。这些不同分辨率的图像被称为图像金字塔(因为当它们被保存在一个堆栈中,图像的底部最大,图像最小时看起来像金字塔)。

图像金字塔有两种。1)高斯金字塔和2)Laplacian Pyramids

高斯金字塔的高层次(低分辨率)是通过在较低水平(高分辨率)图像中移除连续行和列而形成的。然后,每个像素在更高的水平是由5个像素的贡献与高斯加权底层水平的贡献. 通过这样,一个 M * N 的图像成为了M/2 * N/2 的图像。 所以面积减少到原来面积的四分之一,它被称为八度音阶(Octave)。同样的模式继续下去,我们去金字塔(即,分辨率降低)。同样在扩张的同时,面积在每个层面上变成4倍。我们可以找到高斯金字塔使用 cv2.pyrDown() and cv2.pyrUp() functions

现在你可以去CV2图像金字塔 cv2.pyrUp()

img=cv2.imread('123.jpg')
lower_reso=cv2.pyrDwon(img)
higher_reso=cv2.pyrUp(lower_reso)

记住,higher_reso不等于img,因为一旦你降低分辨率,你松散的信息。下面的图像是从以前的情况下最小的图像创建的金字塔的3级。与原始图像比较:

拉普拉斯金字塔是由高斯金字塔形成的。没有唯一的功能。拉普拉斯金字塔图像只有边缘图像。它的大多数元素是零。它们用于图像压缩。拉普拉斯金字塔的水平由高斯金字塔中的水平与高斯金字塔中上层的扩展版本形成。拉普拉斯级别的三个级别将看起来如下(对比度调整,以提高内容):

1、Image Blending using Pyramids(金字塔图像融合)

金字塔的一个应用是图像融合。例如,在图像拼接中,需要将两个图像叠加在一起,但由于图像之间的不连续性,它可能看起来不太好。在这种情况下,图像融合与金字塔给你无缝融合,而不会留下太多的数据在图像中。其中一个典型的例子是两个水果,橘子和苹果的混合。看到结果现在自己明白我在说什么:

请检查附加资源的第一参考,它有完整的图形细节图像融合、Laplacian Pyramids等简单的做如下:

a. 加载两个苹果和橘子图片 b. 寻找苹果和橘子的高斯金字塔 c. 从高斯金字塔,找到他们的拉普拉斯金字塔 d. 现在加入左边一半的苹果和右半的橙色在每个级别的拉普拉斯金字塔 e. 最后从这个联合图像金字塔,重建原始图像。

下面是完整代码。为了简单起见,每一步都单独完成,这可能会占用更多的内存。你可以优化它,如果你想这样做)。

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 level
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)