Python,OpenCV图像金字塔cv2.pyrUp(), cv2.pyrDown()
Posted 程序媛一枚~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python,OpenCV图像金字塔cv2.pyrUp(), cv2.pyrDown()相关的知识,希望对你有一定的参考价值。
这篇博客将介绍图像金字塔的理论,及用图像金字塔cv2.pyrUp(), cv2.pyrDown()实现苹果与梨的完美融合;
1. 效果图
高斯金字塔效果图如下:
一层是另一层的宽高的1/2;
高斯金字塔原图 VS 低分辨率图 VS 高分辨率效果图如下:
可以看到先pyDown丢失了行列信息后,在pyUp填充行列信息图像会极其的模糊。因为一旦降低分辨率,就会丢失信息。
拉普拉斯效果图如下:
图像融合效果图如下:
2. 原理
2.1 什么是图像金字塔
同一幅图像的不同分辨率的图像,从下到上看起来像金字塔,即称之为金字塔;
2.2 金字塔分类
- 高斯金字塔
高斯金字塔中的高层次(低分辨率)是通过去除低层次(高分辨率)图像中的连续行和列而形成的。然后,将底层5个像素的贡献值加上高斯权值,形成更高层次的每个像素;
每一层M×N图像就变成了M/2×N/2图像,面积减少到原来面积的四分之一。它被称为八度音阶。
- 拉普拉斯金字塔
拉普拉斯金字塔是由高斯金字塔形成的;
拉普拉斯金字塔图像就像边缘图像,它的大部分元素是零,用于图像压缩;
拉普拉斯金字塔中的一层是由高斯金字塔中的该层和高斯金字塔中其上层的扩展版本之间的差异形成的。
2.3 应用
- 图像压缩
- 图像大小改变
- 图像融合:使用金字塔进行图像融合可以实现无缝融合,而不会在图像中留下太多数据。
3. 源码
# 图像金字塔
import cv2
import imutils
img = cv2.imread('ym3.jpg')
img = imutils.resize(img, width=500)
lower_reso = img
cv2.imshow("origin", img)
for i in range(0, 3):
lower_reso = cv2.pyrDown(lower_reso)
cv2.imshow("lower_reso " + str(i), lower_reso)
cv2.waitKey(0)
cv2.destroyAllWindows()
img = imutils.resize(img, width=300)
lower_reso = cv2.pyrDown(img)
higher_reso = cv2.pyrUp(lower_reso)
cv2.imshow("origin", img)
cv2.imshow("lower_reso", lower_reso)
cv2.imshow("higher_reso", higher_reso)
cv2.waitKey(0)
def getLaplacian():
img = cv2.imread('ym2.jpg')
img = cv2.resize(img, (800, 800))
# 为图像生成高斯金字塔
G = img.copy()
gpA = [G]
for i in range(4):
G = cv2.pyrDown(G)
gpA.append(G)
# 为图像生成拉普拉斯金字塔
for i in range(4, 0, -1):
GE = cv2.pyrUp(gpA[i])
print(gpA[i - 1].shape, GE.shape)
L = cv2.subtract(gpA[i - 1], GE)
cv2.imshow("Laplacian " + str(i), L)
cv2.waitKey(0)
getLaplacian()
参考
以上是关于Python,OpenCV图像金字塔cv2.pyrUp(), cv2.pyrDown()的主要内容,如果未能解决你的问题,请参考以下文章