OpenCV-Python快速入门(八):图像金字塔
前言
- 本文是个人快速入门OpenCV-Python的电子笔记,由于水平有限,难免出现错漏,敬请批评改正。
- 更多精彩内容,可点击进入
OpenCV-Python快速入门专栏或我的个人主页查看
前提条件
- 熟悉Python
实验环境
- Python 3.x (面向对象的高级语言)
- OpenCV 4.0(python第三方库)
pip3 install opencv-python
图像金字塔
- 图像金字塔是由一幅图像的多个不同分辨率的子图所构成的图像集合。该组图像是由单个图像通过不断地降采样所产生的,最小的图像可能仅仅有一个像素点。
- 图像金字塔是一系列以金字塔形状排列的、自底向上分辨率逐渐降低的图像集合。
高斯金字塔
- 高斯金字塔是通过不断地使用高斯金字塔滤波、采样所产生的,图像金字塔操作中的向下采样流程,如下图所示。
- 注:需要了解高斯滤波的,可查阅OpenCV-Python快速入门(六):图像平滑
cv2.pyrDown()实现图像金字塔
import cv2
import numpy as np
img1=cv2.imread("1.jpg")
img1_resize=cv2.resize(img1,(400,400))
'''
dst = cv2.pyrDown( src[, dstsize[, borderType]] )
参数说明:
dst 为目标图像。
src 为原始图像。
dstsize 为目标图像的大小。
borderType 为边界类型 , 默认值为BORDER_DEFAULT ,
且这里仅支持BORDER_DEFAULT。
'''
r1=cv2.pyrDown(img1_resize)
r2=cv2.pyrDown(r1)
r3=cv2.pyrDown(r2)
cv2.imshow("origin",img1_resize)
cv2.imshow("r1",r1)
cv2.imshow("r2",r2)
cv2.imshow("r3",r3)
cv2.waitKey()
cv2.destroyAllWindows()
cv2.pyrUp()实现图像金字塔
import cv2
import numpy as np
img1=cv2.imread("1.jpg")
img1_resize=cv2.resize(img1,(50,50))
'''
dst = cv2.pyrUp( src[, dstsize[, borderType]] )
参数说明:
dst 为目标图像。
src 为原始图像。
dstsize 为目标图像的大小。
borderType 为边界类型 , 默认值为BORDER_DEFAULT ,
且这里仅支持BORDER_DEFAULT。
'''
r1=cv2.pyrUp(img1_resize)
r2=cv2.pyrUp(r1)
r3=cv2.pyrUp(r2)
cv2.imshow("origin",img1_resize)
cv2.imshow("r1",r1)
cv2.imshow("r2",r2)
cv2.imshow("r3",r3)
cv2.waitKey()
cv2.destroyAllWindows()
拉普拉斯金字塔
- 一幅图像在经过向下采样后,再对其进行向上采样,是无法恢复为原始状态的。
- 向上采样并不是向下采样的逆运算。这是很明显的,因为向下采样时在使用高斯滤波器处理后还要抛弃偶数行和偶数列,不可避免地要丢失一些信息。
- 为了在向上采样时能够恢复具有较高分辨率的原始图像,就要获取在采样过程中所丢失的信息,这些丢失的信息就构成了拉普拉斯金字塔。
- 拉普拉斯金字塔的定义为 L i = G i − p y r U p ( G i + 1 ) L_i = G_i - pyrUp(G_i + 1) Li=Gi−pyrUp(Gi+1)其中, L i L_i Li 表示拉普拉斯金字塔中的第 i i i层。 G i G_i Gi表示高斯金字塔中的第 i i i层。
cv2.pyrDown()和 cv2.pyrUp()构造拉普拉斯金字塔
import cv2
import numpy as np
img1=cv2.imread("1.jpg")
img1_resize=cv2.resize(img1,(400,400))
'''
dst = cv2.pyrDown( src[, dstsize[, borderType]] )
dst = cv2.pyrUp( src[, dstsize[, borderType]] )
参数说明:
dst 为目标图像。
src 为原始图像。
dstsize 为目标图像的大小。
borderType 为边界类型 , 默认值为BORDER_DEFAULT ,
且这里仅支持BORDER_DEFAULT。
'''
G0=img1_resize
G1=cv2.pyrDown(G0)
G2=cv2.pyrDown(G1)
G3=cv2.pyrDown(G2)
L0=G0-cv2.pyrUp(G1)
L1=G1-cv2.pyrUp(G2)
L2=G2-cv2.pyrUp(G3)
cv2.imshow("L0",L0)
cv2.imshow("L1",L1)
cv2.imshow("L2",L2)
cv2.waitKey()
cv2.destroyAllWindows()
应用:恢复高分辨率图像
import cv2
import numpy as np
img1=cv2.imread("1.jpg")
img1_resize=cv2.resize(img1,(400,400))
'''
dst = cv2.pyrDown( src[, dstsize[, borderType]] )
dst = cv2.pyrUp( src[, dstsize[, borderType]] )
参数说明:
dst 为目标图像。
src 为原始图像。
dstsize 为目标图像的大小。
borderType 为边界类型 , 默认值为BORDER_DEFAULT ,
且这里仅支持BORDER_DEFAULT。
'''
G0=img1_resize
G1=cv2.pyrDown(G0)
L0=G0-cv2.pyrUp(G1)
RO=L0+cv2.pyrUp(G1) # 通过拉普拉斯图像复原的原始图像
print("GO.shape=",G0.shape)
print("RO.shape=",RO.shape)
res=RO-G0 # 将 G0 和 RO 做减法运算
# 计算 res 的绝对值,避免求和时负负为正,3+(-3)=0
res=abs(res)
# 计算 res 所有元素的和
print("原始图像 GO 与恢复图像 RO 之差的绝对值和:",np.sum(res))
cv2.imshow("Origin_img_G0",G0)
cv2.imshow("Laplacian_img_L0",L0)
cv2.imshow("Restore_img_RO",RO)
cv2.waitKey()
cv2.destroyAllWindows()
参考文献
[1] https://opencv.org/
[2] 李立宗. OpenCV轻松入门:面向Python. 北京: 电子工业出版社,2019
- 更多精彩内容,可点击进入
OpenCV-Python快速入门专栏或我的个人主页查看