一、图像金字塔
我们把具有不同分辨率的图像集称为“图像金字塔”(因为当它们堆叠在底部时,最高分辨率的图像位于顶部,最低分辨率的图像位于顶部时,看起来像金字塔)。
有高斯金字塔和拉普拉斯金字塔
我们可以使用cv.pyrDown()和cv.pyrUp()函数找到高斯金字塔。
拉普拉斯金字塔由高斯金字塔形成。没有专用功能。拉普拉斯金字塔图像仅像边缘图像。它的大多数元素为零。它们用于图像压缩。
import cv2 as cv
img = cv.imread('E:\\python opencv\\demo2\\a.jpg')
lower_reso = cv.pyrDown(img)
higher_reso2 = cv.pyrUp(lower_reso)
cv.imshow('img', img)
cv.imshow('lower_reso', lower_reso)
cv.imshow('higher_reso2', higher_reso2)
cv.waitKey(0)
cv.destroyAllWindows()
金字塔的一种应用是图像融合。例如,在图像拼接中,您需要将两个图像堆叠在一起,但是由于图像之间的不连续性,可能看起来不太好。在这种情况下,使用金字塔混合图像可以无缝混合,而不会在图像中保留大量数据。一个经典的例子是将两种水果,橙和苹果混合在一起。
1、加载苹果和橙子的两个图像
2、查找苹果和橙子的高斯金字塔(在此示例中,级别数为6)
3、在高斯金字塔中,找到其拉普拉斯金字塔
4、然后在每个拉普拉斯金字塔级别中加入苹果的左半部分和橙子的右半部分
5、最后从此联合图像金字塔中重建原始图像
import cv2 as cv
import numpy as np
A = cv.imread('E:\\python opencv\\demo2\\a1.png')
B = cv.imread('E:\\python opencv\\demo2\\a2.png')
#生成A的高斯金字塔
G = A.copy()
gpA = [G]
for i in range(6):
G = cv.pyrDown(G)
gpA.append(G)
#生成B的高斯金字塔
G = B.copy()
gpB = [G]
for i in range(6):
G = cv.pyrDown(G)
gpB.append(G)
#生成A的拉普拉斯金字塔
lpA = [gpA[5]]
for i in range(5, 0, -1):
GE = cv.pyrUp(gpA[i])
# print(GE.shape)
# print(gpA[i-1].shape)
L = cv.subtract(gpA[i-1], GE) #两个图像相减
lpA.append(L)
#生成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)
#现在在每个级别中添加左右两半图像
LS = []
for la, lb in zip(lpA, lpB):
rows, cols, dpt = la.shape
#图像拼接
ls = np.hstack((la[:, 0:int(cols/2)], lb[:, int(cols/2):]))
LS.append(ls)
#现在重建
ls_ = LS[0]
for i in range(1, 6):
ls_ = cv.pyrUp(ls_)
ls_ = cv.add(ls_, LS[i])
#图像与直接连接的每一半
real1 = np.hstack((A, B))
real = np.hstack((A[:, 0:int(cols/2)], B[:, int(cols/2):]))
cv.imshow('real1', real1)
cv.imshow('real', real)
cv.imshow('ls_', ls_)
cv.waitKey(0)
cv.destroyAllWindows()
图像融合过程中出现的问题:
代码都是按着OpenCv官方文档敲的,但是敲完之后发现运行不了。
1.第一个问题是
L = cv.subtract(gpA[i-1], GE)图像相减这里报错,因为gpA[i-1]和GE的维度不一样所以报错,把两张输入图片的的尺寸改成一样,并且图片像素是2的幂,我的输入图片像素都改成了256*256就好了(2的8次方)
2.第二个问题是
ls = np.hstack((la[:, 0:cols/2], lb[:, cols/2:]))图像拼接这里出错,原因可能是因为除2之后可能是浮点数吧(可能,我也不太懂),加个强制类型转换就好了
ls = np.hstack((la[:, 0:int(cols/2)], lb[:, int(cols/2):]))