【youcans 的 OpenCV 例程200篇】187.由拉普拉斯金字塔还原图像
【youcans 的 OpenCV 例程200篇】187.由拉普拉斯金字塔还原图像
图像金字塔是一系列来源于同一张原始图像、以金字塔形状排列的分辨率逐步降低的图像集合。从底层图像可以看清更多细节,从顶层图像可以看到更多的轮廓特征。通常,上层图像的宽度和高度是相邻的下层图像的 1/2。
6.2 拉普拉斯金字塔(Laplacian pyramid)
在计算高斯金字塔时,不断进行高斯滤波和下采样,丢失了高频信息。为了描述这些高频信息,将通过原图像减去先缩小后放大的图像的一系列差分图像,定义为拉普拉斯金字塔(Laplacian Pyramid)。
用高斯金字塔的每一层图像减去其上一层图像上采样并高斯卷积之后的预测图像(或称复原图像),得到一系列的差值图像,即为拉普拉斯金字塔的分解图像。
对每一层图像先下采样再上采样后,计算与该图像的残差:
L
(
i
)
=
G
(
i
)
−
P
y
r
U
p
[
G
(
i
+
1
)
]
L(i) = G(i) - PyrUp[G(i+1)]
L(i)=G(i)−PyrUp[G(i+1)]
拉普拉斯金字塔可以配合高斯金字塔使用。拉普拉斯金字塔是高斯金字塔的差分图像,保存了高斯金字塔丢失的高频信息,因此可以精确地还原图片信息。从最低分辨率图像上采样,然后逐次加上每个尺度的残差信息,就可以还原到原始的高分辨率图。
例程:1.87 由拉普拉斯金字塔还原图像
# 1.87:由拉普拉斯金字塔还原图像
img = cv2.imread("../images/imgLena.tif", flags=1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
pyrD0 = gray.copy()
# 图像向下取样,构造高斯金字塔
pyrD1 = cv2.pyrDown(pyrD0)
pyrD2 = cv2.pyrDown(pyrD1)
pyrD3 = cv2.pyrDown(pyrD2)
pyrD4 = cv2.pyrDown(pyrD3)
print("pyrD:", pyrD0.shape, pyrD1.shape, pyrD2.shape, pyrD3.shape)
# # 图像向上取样
# pyrU3 = pyrD3.copy()
# pyrU2 = cv2.pyrUp(pyrU3)
# pyrU1 = cv2.pyrUp(pyrU2)
# pyrU0 = cv2.pyrUp(pyrU1)
# print("pyrU:", pyrU0.shape, pyrU1.shape, pyrU2.shape, pyrU3.shape)
# # 构造拉普拉斯金字塔,高斯金字塔的每一层图像减去其上一层图像的上采样
pyrL0 = pyrD0 - cv2.pyrUp(pyrD1)
pyrL1 = pyrD1 - cv2.pyrUp(pyrD2)
pyrL2 = pyrD2 - cv2.pyrUp(pyrD3)
pyrL3 = pyrD3 - cv2.pyrUp(pyrD4)
print("pyrL:", pyrL0.shape, pyrL1.shape, pyrL2.shape, pyrL3.shape)
# 向上采样恢复高分辨率图像
rebuildG3 = pyrL3 + cv2.pyrUp(pyrD4)
rebuildG2 = pyrL2 + cv2.pyrUp(rebuildG3)
rebuildG1 = pyrL1 + cv2.pyrUp(rebuildG2)
rebuildG0 = pyrL0 + cv2.pyrUp(rebuildG1)
print("rebuild:", rebuildG0.shape, rebuildG1.shape, rebuildG2.shape, rebuildG3.shape)
print("diff of rebuild:", np.mean(abs(rebuildG0-img)))
plt.figure(figsize=(10, 9))
plt.subplot(341), plt.axis('off'), plt.title("GaussPyramid "+str(pyrD0.shape))
plt.imshow(cv2.cvtColor(pyrD0, cv2.COLOR_BGR2RGB))
plt.subplot(342), plt.axis('off'), plt.title(str(pyrD1.shape))
plt.imshow(cv2.cvtColor(pyrD1, cv2.COLOR_BGR2RGB))
plt.subplot(343), plt.axis('off'), plt.title(str(pyrD2.shape))
plt.imshow(cv2.cvtColor(pyrD2, cv2.COLOR_BGR2RGB))
plt.subplot(344), plt.axis('off'), plt.title(str(pyrD3.shape))
plt.imshow(cv2.cvtColor(pyrD3, cv2.COLOR_BGR2RGB))
plt.subplot(345), plt.axis('off'), plt.title("LaplacePyramid "+str(pyrL0.shape))
plt.imshow(cv2.cvtColor(pyrL0, cv2.COLOR_BGR2RGB))
plt.subplot(346), plt.axis('off'), plt.title(str(pyrL1.shape))
plt.imshow(cv2.cvtColor(pyrL1, cv2.COLOR_BGR2RGB))
plt.subplot(347), plt.axis('off'), plt.title(str(pyrL2.shape))
plt.imshow(cv2.cvtColor(pyrL2, cv2.COLOR_BGR2RGB))
plt.subplot(348), plt.axis('off'), plt.title(str(pyrL3.shape))
plt.imshow(cv2.cvtColor(pyrL3, cv2.COLOR_BGR2RGB))
plt.subplot(349), plt.axis('off'), plt.title("LaplaceRebuild "+str(rebuildG0.shape))
plt.imshow(cv2.cvtColor(rebuildG0, cv2.COLOR_BGR2RGB))
plt.subplot(3,4,10), plt.axis('off'), plt.title(str(rebuildG1.shape))
plt.imshow(cv2.cvtColor(rebuildG1, cv2.COLOR_BGR2RGB))
plt.subplot(3,4,11), plt.axis('off'), plt.title(str(rebuildG2.shape))
plt.imshow(cv2.cvtColor(rebuildG2, cv2.COLOR_BGR2RGB))
plt.subplot(3,4,12), plt.axis('off'), plt.title(str(rebuildG3.shape))
plt.imshow(cv2.cvtColor(rebuildG3, cv2.COLOR_BGR2RGB))
plt.tight_layout()
plt.show()
运行结果:
pyrD: (512, 512, 3) (256, 256, 3) (128, 128, 3) (64, 64, 3)
pyrL: (512, 512, 3) (256, 256, 3) (128, 128, 3) (64, 64, 3)
rebuild: (512, 512, 3) (256, 256, 3) (128, 128, 3) (64, 64, 3)
diff of rebuild: 0.0
(本节完)
版权声明:
OpenCV 例程200篇 总目录-202205更新
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/124866116)
Copyright 2022 youcans, XUPT
Crated:2022-5-18
欢迎关注 『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更新】
相关文章
- OpenCV每日函数 结构分析和形状描述符(3) 直立矩形/最小外接圆/最小外接矩形/最小外接三角形/拟合椭圆
- OpenCV每日函数 图像过滤模块 (15) morphologyEx高级形态学函数
- OpenCV每日函数 结构分析和形状描述符(5) 轮廓计算等相关函数
- Opencv学习笔记 - 使用OpenCV,scikit-image和Python检测低对比度图像
- 【OpenCV-Python】教程:2-1 图像基础操作
- Py之cv2:cv2(OpenCV,opencv-python)库的简介、安装、使用方法(常见函数、图像基本运算等)最强详细攻略
- How_to_setup_Qt_and_openCV_on_Windows
- opencv 自适应阈值
- 在OpenCV里学习常见问题汇编23
- 在OpenCV里学习常见问题汇编13
- 在OpenCV里为什么拉普拉斯变换是高通滤波
- 在OpenCV里图像数据与一维数组转换
- Opencv项目实战:13 手部追踪
- Opencv实现图形的几何变换【python】
- 【OpenCV 例程300篇】12. 图像通道的合并(cv2.merge)
- 【OpenCV 例程200篇】77. OpenCV 实现快速傅里叶变换
- 【youcans 的 OpenCV 例程200篇】186.图像金字塔之拉普拉斯金字塔
- opencv图像旋转和翻转,cv2.flip,cv2.rotate
- opencv-python 通过 PIL支持中文添加文字,速度还慢,最好使用英文
- Opencv从入门到精通(四):在图像上画线/矩形/圆/文字
- Opencv 基本操作七 提取两幅图像的重叠区域
- OpenCV-Python学习(19)—— OpenCV 图像几何变换之图像缩放(cv.warpAffine、cv.resize)
- yolov4视频目标检测:使用C++版本联合CUDA11.2的OpenCV 5.x编译生成opencv-python==5.x进行推理