python-opencv Tutorials 一码人翻译(17)图像处理----图像金字塔

目标

在这一章,

我们将学习图像金字塔

我们将使用图像金字塔来创造一个新的水果,“Orapple”

我们将看到这些函数:cv.pyrUp()cv.pyrDown()

理论

通常,我们使用的是一个恒定大小的图像。但在某些情况下,我们需要使用不同分辨率的图像(相同的)图像。例如,当我们在图像中搜索某样东西时,比如脸部,我们不确定在图像中物体会出现多大的尺寸。在这种情况下,我们需要用不同的分辨率创建一组相同的图像,并在所有这些分辨率中搜索对象。这些具有不同分辨率的图像被称为图像金字塔(因为当它们被保存在一个具有最高分辨率图像的堆栈中,而在顶部的分辨率最低的图像时,它看起来就像一个金字塔)。

有两种类型的图像金字塔,1)高斯金字塔和2)拉帕拉斯金字塔

高斯金字塔中的高电平(低分辨率)是通过在较低层次(高分辨率)图像中移除连续的行和列而形成的。然后,更高层次的每个像素都是由5个像素的基础水平和高斯权值组成的。通过这样做,

M×N

图像变得

M / 2×N / 2

的形象。所以面积减少到原来面积的四分之一。它被称为一个八度音阶。当我们在金字塔的顶端(也就是分辨率下降)时,同样的模式也会继续。类似地,在扩展时,区域在每个级别上变成4次。我们可以使用cv.吡咯()和cv.pyrUp()函数找到高斯金字塔。

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

img = cv.imread('lenna.jpg')

lower_reso = cv.pyrDown(img)
higher_reso2 = cv.pyrUp(img)
cv.imshow('res1', lower_reso )
cv.imshow('res', higher_reso2)
cv.waitKey(0)
cv.destroyAllWindows()

 

  • 使用金字塔图像融合

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

请参阅参考资料中的第一个参考资料,它有完整的图片混合、拉帕拉斯金字塔等的详细资料,简单地说如下:

加载苹果和橘子的两张图片

为苹果和橘子找到高斯金字塔(在这个例子中,级别的数量是6)

从高斯金字塔中找到他们的拉帕拉斯金字塔

现在加入苹果的左半部分和右半部分的橙色在拉帕拉斯金字塔的每一层

最后,从这个联合图像金字塔,重建原始图像。

下面是完整的代码。(为了简单起见,每一步都是分开完成的,这可能需要更多的内存。如果你愿意,你可以优化它)。

import cv2 as cv
import numpy as np

import copy


A = cv.imread('A.png')
B = cv.imread('O.png')

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

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

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

# generate Laplacian Pyramid for B
lpB = [gpB[5]]
for i in range(5,0,-1):
    GE = cv.pyrUp(gpB[i])
    L = cv.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 range(1,6):
    ls_ = cv.pyrUp(ls_)
    ls_ = cv.add(ls_, LS[i])

# image with direct connecting each half
real = np.hstack((A[:,:cols//2],B[:,cols//2:]))

cv.imwrite('Pyramid_blending2.jpg',ls_)
cv.imwrite('Direct_blending.jpg',real)

注意首先要把图片改成64的倍数行列

两张图片要大小一致

import cv2 as cv
import numpy as np,sys


srcImg = cv.imread('apple.png')
srcImg2 = cv.imread('orange.png')
A=cv.resize(srcImg , (640,640))
B=cv.resize(srcImg2 , (640,640))
cv.imwrite('A.png',A)
cv.imwrite('O.png',B)

import copy 

ls = np.hstack((la[:,0:cols//2], lb[:,cols//2:]))里面//是两个

猜你喜欢

转载自blog.csdn.net/qq_41905045/article/details/81351662