拉噗拉司金字塔LaplacianPyramid学习笔记(一半章子怡 + 一半孙俪)
发布日期:2022-01-31 02:37:39 浏览次数:37 分类:技术文章

本文共 2173 字,大约阅读时间需要 7 分钟。

OpenCV3拉噗拉噗拉噗拉嘶金字塔LaplacianPyramid学习笔记(一半章子怡 + 一半孙俪)

这个算法对我来说很难,所以写下过程来记录

OpenCV中的一个基本的左右混合图片的算法,对大神来说可能很简单,小白觉得光看官方的代码还有很多不能理解的地方。所以特地作了一些图来帮助自己理解和记录。也希望对同样刚入门计算机图像的人有所帮助。

PS:如果理解不到位,或者有更多给我的学习建议,请给我留言哈~

Emmm, 混合橘子和苹果有什么意思嘛!

我们来找两个美女混一下~
个人还是更喜欢孙俪的颜(严重跑偏
在这里插入图片描述孙俪

第一步,为两张图分别生成高斯金字塔

// 载入库,读入图片import cv2import numpy as npA = cv2.imread('SunLi.jpg')B = cv2.imread('ZhangZiYi.jpg')// 为孙俪生成高斯金字塔G = A.copy()gpA = [G]for i in range(6):    G = cv2.pyrDown(G)    gpA.append(G)    // 为章子怡生成高斯金字塔H = B.copy()gpB = [H]for i in range(6):    H = cv2.pyrDown(H)    gpB.append(H)

cv2.pyrDown(src)

顶部图像中的每个像素值等于下一层图像中 5 个像素的高斯加权平均值
如下图所示,1号像素取其上下左右中的高斯平均数,234号亦然。
这个操作相当于抽离了一半的列和行。图像变为原来的一半。
在这里插入图片描述

第二步,为两张图分别生成拉普拉斯金字塔

// 为A生成拉普拉斯金字塔lpA = [gpA[5]]for i in range(5, 0, -1):    // 将金字塔升级    UP = cv2.pyrUp(gpA[i])    // 用上一层的金字塔减去升级完的金字塔    LA = cv2.subtract(gpA[i-1], UP)    // 将这一层加入数列    lpA.append(LA)// 为B生成拉普拉斯金字塔lpB = [gpB[5]]for i in range(5, 0, -1):    // 将金字塔升级    UP = cv2.pyrUp(gpB[i])    // 用上一层的金字塔减去升级完的金字塔    LA = cv2.subtract(gpB[i-1], UP)    // 将这一层加入数列    lpB.append(LA)

在这里插入图片描述

在这里插入图片描述
cv2.pyrUp(src)
这个函数负责把小的图像放大两倍(信息有丢失的)
我们从gpA[5]开始,把它放大两倍,然后储存在UP中

cv2.subtract(gpA[i-1], UP)

然后我们用和UP一样大小,但信息量更大的gpA[i-1]去减去UP
如上图所示
第一步是“gpA[4]” 减去 “gpA[5]的up版本”,储存在lpA[1]中。
第二步是是“gpA[3]“ 减去 “gpA[4]的up版本”,储存在lpA[2]中,以此类推。

数学公式如下图所示

G代表高斯金字塔,L代表拉普拉斯金字塔
它生成的图片很像边界图,大部分的像素点都是0
在这里插入图片描述

第三步, 融合两张图的拉普怕斯金字塔

// 每一层拉普拉斯都是一半左边一半右边LS = []// 把两张图的每一层通过zip两两配对for la, lb in zip(lpA, lpB):	// 读取图片的列数 cols    rows, cols, dpt = la.shape    // 取孙俪的左边,章子怡的右边融合成新的拉普怕斯金字塔    ls = np.hstack((la[:, :int(cols/2)], lb[:, int(cols/2):]))    LS.append(ls)

在这里插入图片描述

这里我们注意到除了LS[0]取自于一半的lpA[0]和lpB[0]是“彩色”的图像
其他的都是“边缘”图像

第四步,不停的pryUP最小的图像,并将其与拉普拉斯的上层相加,获得最终图像

// 重新构建图像ls_ = LS[0]for i in range(1, 6):	//不停的pyrUP最小的图像    ls_ = cv2.pyrUp(ls_)    //并将其与一半一半的拉普拉斯相加    ls_ = cv2.add(ls_, LS[i])    cv2.imshow('image', ls_)cv2.waitKey(0)cv2.destroyAllWindows()

在这里插入图片描述

这个步骤我的理解是:
1.模糊放大一个图片
2.强化这个图片的边缘
3.循环上面这个过程

emmmm,所以最后我们就获得了一个肥肠模糊…但是边缘又不糊的混合图像…

在这里插入图片描述
emmmm,总之就是…奇丑无比…有点微妙

后记-一些小想法

通过强调拼合的边缘+模糊放大的办法,自然的融合了图像,不过丢失的信息让图像看上去有点不真实。边缘一直累加超过255了,就很泛白(莫名还有点像打了高光??)

感觉如果多加一些边界,而不是一半一半的办法来混合图像的话效果应该会很有趣(就是hstack那里要再想一下)

或者就单纯用来处理一张图像,再调一下色调啥的(港风P图系列??)

希望我的记录对和我一样的小白有帮助!

转载地址:https://blog.csdn.net/qq_20474257/article/details/89785478 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:C++计算二进制数中1的个数
下一篇:2019/5/6 从贝叶斯定理到线性回归推论

发表评论

最新留言

很好
[***.229.124.182]2024年04月17日 18时49分54秒