赞
踩
拉普拉斯金字塔(The Laplacian pyramid)有什么用?如何实现上下采样的逆操作?是什么原理?
众所周知,上采样和下采样是不不可逆的操作。也就是:
通过以上分析可知,向上采样和向下采样是相反的两种操作。但是,由于向下采样会丢失像素值,所以这两种操作并不是可逆的。也就是说,对一幅图像先向.上采样、再向下采样,是无法恢复其原始状态的;同样,对一幅图像先向下采样、再向上采样也无法恢复到原始状态。
–摘自《OpenCV 轻松入门:面向 Python》
因此,我们引入了拉普拉斯金字塔(The Laplacian pyramid)。
一言概之,拉普拉斯金字塔(The Laplacian pyramid)就是 :每一层的图像是由 :拉普拉斯金字塔中的第i层,等于「高斯金字塔中的第i层」与「高斯金字塔中的第i+1层的向上采样结果」之差。
书里面有很多图,简单易懂,再次推荐这本书《OpenCV 轻松入门:面向 Python》,入门利器。 一些小错误也已经在博文视点上做了勘误。
由上一小节我们知道,拉普拉斯金字塔是一个"高斯差值金字塔"。
所以拉普拉斯金字塔实际上是保存的是损失部分信息。
左图是右图的简化,这样看比简洁,但是仍然不够直观。
书上的demo我就暂时不参考了(我某平台借阅的正版的电子版排版有问题),把我自己学习的时候写的demo发给大家。
这个效果用我原来的apple不好做,我还去专门找了一下 Lena小姐的照片。
补充一个概念,以免有同学混淆,所谓高斯金字塔:
import numpy as np import cv2 as cv from matplotlib import pyplot as plt img = cv.imread('lena.jpg', cv.IMREAD_GRAYSCALE) Gus0 = img Gus1 = cv.pyrDown(Gus0) Gus2 = cv.pyrDown(Gus1) Gus3 = cv.pyrDown(Gus2) Lap0 = Gus0 - cv.pyrUp(Gus1) Lap1 = Gus1 - cv.pyrUp(Gus2) Lap2 = Gus2 - cv.pyrUp(Gus3) prGus = cv.pyrUp(Gus3) for i in range(2): prGus = cv.pyrUp(prGus) plt.figure(0) plt.subplot(221), plt.imshow(img, 'gray'), plt.title('Org/Gus0'), plt.axis('off') plt.subplot(222), plt.imshow(Gus3, 'gray'), plt.title('Gus3'), plt.axis('off') # 为了效果明显 我们选用第3层高斯 plt.subplot(223), plt.imshow(cv.pyrUp(Gus3), 'gray'), plt.title('prGus'), plt.axis('off') # 如果我们直接上采样 plt.subplot(224), plt.imshow(Lap2, 'gray'), plt.title('LAP2'), plt.axis('off') plt.figure(1) rep = Lap0 + cv.pyrUp(Lap1 + cv.pyrUp(Lap2 + cv.pyrUp(Gus3))) plt.subplot(121), plt.imshow(img, 'gray'), plt.title('Org/Gus0'), plt.axis('off') plt.subplot(122), plt.imshow(rep, 'gray'), plt.title('LapToRestore'), plt.axis('off')
为了效果,我们采用第四层Gaussian作为比较对象
可以看到,第四层高斯(第二幅图)是非常模糊的。
直接向上采样四次(第三幅图)的还原图也是模糊,这足以证明Gauss不是一个可逆操作。
第四幅图是第三层拉普拉斯金字塔图像。
使用拉普拉斯金字塔修复后:
为了确定是否是无损复原,我们简单验证一下:
可以看到img和rep是完全相等两个numpy array
拉普拉斯金字塔毫无疑问可以完成无损修复,因为他就是记录了损失信息。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。