youcans 的 OpenCV 例程200篇186.图像金字塔之拉普拉斯金字塔
Posted 小白YouCans
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了youcans 的 OpenCV 例程200篇186.图像金字塔之拉普拉斯金字塔相关的知识,希望对你有一定的参考价值。
【youcans 的 OpenCV 例程200篇】186.图像金字塔之拉普拉斯金字塔
图像金字塔是一种以多分辨率来解释图像的结构,常用于图像分割、图像压缩和机器视觉。
图像金字塔是一系列来源于同一张原始图像、以金字塔形状排列的分辨率逐步降低的图像集合。从底层图像可以看清更多细节,从顶层图像可以看到更多的轮廓特征。通常,上层图像的宽度和高度是相邻的下层图像的 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.86 拉普拉斯图像金字塔
# # 1.86:拉普拉斯金字塔 (Gaussian pyramid)
img = cv2.imread("../images/Fig0515a.tif", flags=1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 图像向下取样, 构造高斯金字塔
temp = gray.copy()
gaussPyr = [temp] # 原始图像为第 0 层
levels = 4 # 高斯金字塔共 4 层: 0,1,2,3
for i in range(1, levels): # 计算第 i 层高斯金字塔
temp = cv2.pyrDown(temp)
gaussPyr.append(temp)
print(i, temp.shape)
# 图像向上取样, 构造拉普拉斯金字塔
laplacePyr = [gaussPyr[-1]] # 从最顶层开始恢复
for i in range(levels-1, 0, -1): # 拉普拉斯金字塔共 3 层: 2,1,0
tempUp = cv2.pyrUp(gaussPyr[i]) # 上取样
laplace = cv2.subtract(gaussPyr[i-1], tempUp) # 残差
laplacePyr.append(laplace)
print(i, laplace.shape)
plt.figure(figsize=(10, 6))
plt.subplot(241), plt.axis('off'), plt.title("GaussPyramid "+str(gaussPyr[0].shape[:2]))
plt.imshow(gaussPyr[0], 'gray')
plt.subplot(242), plt.axis('off'), plt.title("->"+str(gaussPyr[1].shape[:2]))
plt.imshow(gaussPyr[1], 'gray')
# down1 = np.zeros_like(gray, dtype=np.uint8)
# down1[:gaussPyr[1].shape[0],:gaussPyr[1].shape[1]] = gaussPyr[1]
# plt.imshow(down1, 'gray')
plt.subplot(243), plt.axis('off'), plt.title("->"+str(gaussPyr[2].shape[:2]))
plt.imshow(gaussPyr[2], 'gray')
# down2 = np.zeros_like(gray, dtype=np.uint8)
# down2[:gaussPyr[2].shape[0],:gaussPyr[2].shape[1]] = gaussPyr[2]
# plt.imshow(down2, 'gray')
plt.subplot(244), plt.axis('off'), plt.title("->"+str(gaussPyr[3].shape[:2]))
plt.imshow(gaussPyr[3], 'gray')
# down3 = np.zeros_like(gray, dtype=np.uint8)
# down3[:gaussPyr[3].shape[0],:gaussPyr[3].shape[1]] = gaussPyr[3]
# plt.imshow(down3, 'gray')
plt.subplot(248), plt.axis('off'), plt.title("<- LaplacePyramid")
plt.imshow(laplacePyr[0], 'gray')
# lPyr0 = np.zeros_like(gray, dtype=np.uint8)
# lPyr0[:laplacePyr[0].shape[0],:laplacePyr[0].shape[1]] = laplacePyr[0]
# plt.imshow(lPyr0, 'gray')
plt.subplot(247), plt.axis('off'), plt.title("<-"+str(laplacePyr[1].shape[:2]))
plt.imshow(laplacePyr[1], 'gray')
# lPyr1 = np.zeros_like(gray, dtype=np.uint8)
# lPyr1[:laplacePyr[1].shape[0],:laplacePyr[1].shape[1]] = laplacePyr[1]
# _, binPyr1 = cv2.threshold(lPyr1, 20, 255, cv2.THRESH_BINARY) # 二值化处理
# plt.imshow(binPyr1, 'gray') # 二值化处理是为了将拉普拉斯金字塔显示更清楚
plt.subplot(246), plt.axis('off'), plt.title("<-"+str(laplacePyr[2].shape[:2]))
plt.imshow(laplacePyr[2], 'gray')
# lPyr2 = np.zeros_like(gray, dtype=np.uint8)
# lPyr2[:laplacePyr[2].shape[0],:laplacePyr[2].shape[1]] = laplacePyr[2]
# _, binPyr2 = cv2.threshold(lPyr2, 20, 255, cv2.THRESH_BINARY)
# plt.imshow(lPyr2, 'gray') # 二值化处理后的已经不是拉普拉斯残差图像
plt.subplot(245), plt.axis('off'), plt.title("<-"+str(laplacePyr[3].shape[:2]))
plt.imshow(laplacePyr[3], 'gray')
# lPyr3 = np.zeros_like(gray, dtype=np.uint8)
# lPyr3[:laplacePyr[3].shape[0],:laplacePyr[3].shape[1]] = laplacePyr[3]
# _, binPyr3 = cv2.threshold(lPyr3, 20, 255, cv2.THRESH_BINARY)
# plt.imshow(lPyr3, 'gray')
plt.tight_layout()
plt.show()
(本节完)
版权声明:
OpenCV 例程200篇 总目录-202205更新
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/124834567)
Copyright 2022 youcans, XUPT
Crated:2022-5-18
欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中【youcans 的 OpenCV 例程200篇】147. 图像分割之孤立点检测
【youcans 的 OpenCV 例程200篇】148. 图像分割之线检测
【youcans 的 OpenCV 例程200篇】149. 图像分割之边缘模型
【youcans 的 OpenCV 例程200篇】150. 边缘检测梯度算子
【youcans 的 OpenCV 例程200篇】151. 边缘检测中的平滑处理
【youcans 的 OpenCV 例程200篇】152. 边缘检测之 LoG 算子
【youcans 的 OpenCV 例程200篇】153. 边缘检测之 DoG 算子
【youcans 的 OpenCV 例程200篇】154. 边缘检测之 Canny 算子
【youcans 的 OpenCV 例程200篇】155. 边缘连接的局部处理方法
【youcans 的 OpenCV 例程200篇】156. 边缘连接局部处理的简化算法
【youcans 的 OpenCV 例程200篇】157. 霍夫变换直线检测
【youcans 的 OpenCV 例程200篇】158. 阈值处理之固定阈值法
【youcans 的 OpenCV 例程200篇】159. 图像分割之全局阈值处理
【youcans 的 OpenCV 例程200篇】160. 图像处理之OTSU 方法
【youcans 的 OpenCV 例程200篇】161. OTSU 阈值处理算法的实现
【youcans 的 OpenCV 例程200篇】162. 全局阈值处理改进方法
【youcans 的 OpenCV 例程200篇】163. 基于边缘信息改进全局阈值处理
【youcans 的 OpenCV 例程200篇】164.使用 Laplace 边缘信息改进全局阈值处理
【youcans 的 OpenCV 例程200篇】165.多阈值 OTSU 处理方法
【youcans 的 OpenCV 例程200篇】166.自适应阈值处理
【youcans 的 OpenCV 例程200篇】167.基于移动平均的可变阈值处理
【youcans 的 OpenCV 例程200篇】168.图像分割之区域生长
【youcans 的 OpenCV 例程200篇】169.图像分割之区域分离
【youcans 的 OpenCV 例程200篇】170.图像分割之K均值聚类
【youcans 的 OpenCV 例程200篇】171.SLIC 超像素区域分割
【youcans 的 OpenCV 例程200篇】172.SLIC 超像素区域分割算法比较
【youcans 的 OpenCV 例程200篇】173.SEEDS 超像素区域分割
【youcans 的 OpenCV 例程200篇】174.LSC 超像素区域分割
【youcans 的 OpenCV 例程200篇】175.超像素区域分割方法比较
【youcans 的 OpenCV 例程200篇】176.图像分割之均值漂移算法
【youcans 的 OpenCV 例程200篇】177.图像分割之 GraphCuts 图割法
【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法(框选前景)
【youcans 的 OpenCV 例程200篇】179.图像分割之 GrabCut 图割法(掩模图像)
【youcans 的 OpenCV 例程200篇】180.基于距离变换的分水岭算法
【youcans 的 OpenCV 例程200篇】181.基于 Sobel 梯度的分水岭算法
【youcans 的 OpenCV 例程200篇】182.基于形态学梯度的分水岭算法
【youcans 的 OpenCV 例程200篇】183.基于轮廓标记的分水岭算法
【youcans 的 OpenCV 例程200篇】184.鼠标交互标记的分水岭算法
【youcans 的 OpenCV 例程200篇】185.图像金字塔之高斯金字塔
【youcans 的 OpenCV 例程200篇】186.图像金字塔之拉普拉斯金字塔
以上是关于youcans 的 OpenCV 例程200篇186.图像金字塔之拉普拉斯金字塔的主要内容,如果未能解决你的问题,请参考以下文章
youcans 的 OpenCV 例程200篇182.基于形态学梯度的分水岭算法
youcans 的 OpenCV 例程200篇179.图像分割之 GrabCut 图割法(掩模图像)