OpenCV 例程200篇 总目录-202205更新
图像金字塔是一系列来源于同一张原始图像、以金字塔形状排列的分辨率逐步降低的图像集合。从底层图像可以看清更多细节,从顶层图像可以看到更多的轮廓特征。通常,上层图像的宽度和高度是相邻的下层图像的 1/2。
在计算高斯金字塔时,不断进行高斯滤波和下采样,丢失了高频信息。为了描述这些高频信息,将通过原图像减去先缩小后放大的图像的一系列差分图像,定义为拉普拉斯金字塔(Laplacian Pyramid)。
由于图像噪声、光照、曝光度、模型匹配误差等因素,图像直接拼接合成会在图像重叠区域的拼接处出现明显的痕迹 。图像融合的目的就是使两幅图像的重叠区域过渡自然且平滑。
拉普拉斯金字塔将源图像分解到不同的频带,越高频的图像信息越到上层。在相同显示尺寸下比较不同分辨率的拉普拉斯图像,可以发现不同尺度下关注的细节是不同的,低分辨率下关注的是较大尺度的基本纹理,而高分辨率下关注的是更精细的纹理。
因此,可以针对不同分解层的频带特征与细节,采用不同的融合算子以突出特定频带上特征与细节,也就可以将不同图像的特征与细节融合在一起。
金字塔图像融合过程,是在不同尺度、不同空间分辨率和不同分解层上分别进行的,也称为多波段融合(Multi-band Blending)。多波段融合的思想,是先对多幅图像分别构建拉普拉斯金字塔,然后对同一层图像(相同频段)按一定规则融合,对融合后的图像金字塔重建得到融合图像。
基于拉普拉斯金字塔的图像融合的基本步骤为:
1、对左图、右图分别构建高斯金字塔;
2、对左图、右图分别构建拉普拉斯金字塔;
3、在每个尺度(分辨率)下,根据当前尺度拼接左、右图的拉普拉斯图像 ,得到拼接图像的拉普拉斯金字塔;
4、由最低分辨率的高斯图像生成最低分辨率的起始图,通过拼接图像的拉普拉斯金字塔,逐层(逐个分辨率)重建拼接图像,直到得到最高分辨率的拼接图像。
# 1.88:拉普拉斯金字塔图像融合
img1 = cv2.imread("../images/buddha01.png")
img2 = cv2.imread("../images/buddha03.png")
img1 = cv2.resize(img1, (512, 512), interpolation=cv2.INTER_CUBIC) # 将图片大小调整到 2**levels 的整数倍
img2 = cv2.resize(img2, (512, 512), interpolation=cv2.INTER_CUBIC)
# 直接左右拼接图像 (用于对比)
rows, cols, channel = img1.shape
stack = np.hstack((img1[:,:int(cols/2)], img2[:,int(cols/2):]))
# 图像向下取样, 构造高斯金字塔: [原图,下取样1次,下取样2次,下取样3次,下取样4次]
levels = 5 # 高斯金字塔层数
gaussPyr1, gaussPyr2 = [img1], [img2] # 原始图像为高斯金字塔第 0 层, (512, 512)
for i in range(1, levels): # 高斯金字塔共 5 层: 0,1,2,3,4
gaussPyr1.append(cv2.pyrDown(gaussPyr1[i-1])) # 计算第 i 层高斯金字塔
gaussPyr2.append(cv2.pyrDown(gaussPyr2[i-1]))
# 图像向上取样, 构造拉普拉斯金字塔 [第1层残差,第2层残差,第3层残差,第4层残差]
lapPyr1, lapPyr2 = [], [] # 从最顶层开始恢复
for i in range(levels-1): # 拉普拉斯金字塔有 4 层: 0,1,2,3
lapPyr1.append(gaussPyr1[i] - cv2.pyrUp(gaussPyr1[i+1]))
lapPyr2.append(gaussPyr2[i] - cv2.pyrUp(gaussPyr2[i+1]))
# 拉普拉斯金字塔左右拼接
lapStack = []
for i in range(levels-1): # 拉普拉斯金字塔共 4 层: 0,1,2,3
rows, cols, channel = lapPyr1[i].shape
splicing = np.hstack((lapPyr1[i][:, 0:int(cols/2)], lapPyr2[i][:, int(cols/2):]))
lapStack.append(splicing)
print("lapStack", i, lapStack[i].shape)
# 由拼接后的Laplace金字塔恢复原图像
rows, cols, channel = gaussPyr1[-1].shape # 高斯金字塔顶层 G4:(32,32)
stackG4 = np.hstack((gaussPyr1[-1][:,:int(cols/2)], gaussPyr2[-1][:,int(cols/2):])) # 拼接高斯金字塔顶层
stackG3 = lapStack[3] + cv2.pyrUp(stackG4) # stackG3:(64,64)
stackG2 = lapStack[2] + cv2.pyrUp(stackG3) # stackG2:(128,128)
stackG1 = lapStack[1] + cv2.pyrUp(stackG2) # stackG1:(256,256)
stackG0 = lapStack[0] + cv2.pyrUp(stackG1) # stackG0:(512,512)
plt.figure(figsize=(9, 7))
plt.subplot(221), plt.axis('off'), plt.title("BuddhaFace A")
plt.imshow(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB))
plt.subplot(222), plt.axis('off'), plt.title("BuddhaFace B")
plt.imshow(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB))
plt.subplot(223), plt.axis('off'), plt.title("BuddhaFace stacked")
plt.imshow(cv2.cvtColor(stack, cv2.COLOR_BGR2RGB))
plt.subplot(224), plt.axis('off'), plt.title("Laplacian blended")
plt.imshow(cv2.cvtColor(stackG0, cv2.COLOR_BGR2RGB))
plt.tight_layout()
plt.show()
程序说明:
左下图是基于拉普拉斯金字塔的图像融合,右下图是图像直接进行拼接的结果。直接拼接时,在左右拼接处可以看到非常明显、锐利的拼接缝,称为截断现象(Seams)。基于拉普拉斯金字塔的图像拼接,通过多频带融合,使两幅图像的重叠区域过渡自然且平滑。
(本节完)
版权声明:
OpenCV 例程200篇 总目录-202205更新
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/124866268)
Copyright 2022 youcans, XUPT
Crated:2022-5-20
欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中【youcans 的 OpenCV 例程200篇】185.图像金字塔之高斯金字塔
【youcans 的 OpenCV 例程200篇】186.图像金字塔之拉普拉斯金字塔
【youcans 的 OpenCV 例程200篇】187.由拉普拉斯金字塔还原图像
【youcans 的 OpenCV 例程200篇】188.基于拉普拉斯金字塔的图像融合
【youcans 的 OpenCV 例程200篇】189.基于掩模的拉普拉斯金字塔图像融合
【youcans 的 OpenCV 例程200篇】190.基于图像分割的图像融合
【youcans 的 OpenCV 例程200篇】191.基于图像分割的金字塔图像融合
【youcans 的 OpenCV 例程200篇】192.Gabor 滤波器组的形状
【youcans 的 OpenCV 例程200篇】193.基于Gabor 滤波器的特征提取
更多内容,请见:
【OpenCV 例程200篇 总目录-202206更新】