热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

图像金字塔实现图像融合(基于opencvpython)

图像金字塔介绍图像金字塔是多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐渐降低并且来源于同

图像金字塔介绍


  • 图像金字塔是多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐渐降低并且来源于同一张原始图像的集合。通过梯次向下采样获得,直到某个终止条件才停止采样。
  • 图像金字塔说白了就是披着金字塔外衣的图像缩放。一般有高斯图像金字塔、拉普拉斯图像金字塔。

两种金字塔介绍


高斯金字塔(低通)

高斯金字塔:用于下采样。高斯金字塔是最基本的图像塔。
原理:首先将原图像作为最底层图像G0(高斯金字塔的第0层),利用高斯核(5*5)对其进行卷积(高斯平滑),然后对卷积后的图像进行下采样(去除偶数行和列)得到上一层图像G1,将此图像作为输入,重复卷积和下采样操作得到更上一层图像,反复迭代多次,形成一个金字塔形的图像数据结构,即高斯金字塔

由于上采样和下采样是非线性处理,是不可逆的有损处理,因此下采样后的图像想要还原回原来的尺寸的话会丢失很多信息,使图片变模糊。
                在这里插入图片描述
上图就是使用高斯金字塔之后的结果。

拉普拉斯金字塔(带通金字塔)

拉普拉斯金字塔:用于重建图像,也就是预测残差,对图像进行最大程度的还原
一幅小图像重建为一幅大图原理:用高斯金字塔的每一层图像减去其上一层图像上采样并高斯卷积之后的预测图像,得到一系列的差值图像即为 LP 分解图像。

拉普拉斯金字塔实际上是通过计算图片先下采样再上采样后的结果和原图片的残差来保存缺失信息的,公式为:L(i)=G(i)−PyrUp(G(i+1))L(i) = G(i) - PyrUp(G(i + 1))L(i)=G(i)PyrUp(G(i+1))
也就是说,拉普拉斯金字塔实际上是由上面的残差图片组成的金字塔,它为还原图片做准备
求得每个图像的拉普拉斯金字塔后需要对相应层次的图像进行融合,最终还原图像。
拉普拉斯金字塔可以精确还原图片信息。
还原图像的过程就是重构的过程。在这里插入图片描述
上图能够比较好的理解拉普拉斯金字塔的计算过程。

图像金字塔应用

图像金字塔非常重要的一个应用就是实现图像分割。图像分割的话,先要建立一个图像金字塔,然后在Gi和Gi+1的像素直接依照对应的关系,建立起”父与子“关系。而快速初始分割可以先在金字塔高层的低分辨率图像上完成,然后逐层对分割加以优化。

实例1 高斯金字塔和拉普拉斯金字塔显示:

代码:

import cv2 as cv
#高斯金字塔
def pyramid_demo(image):level = 3 #设置金字塔的层数为3temp = image.copy() #拷贝图像pyramid_images = [] #建立一个空列表for i in range(level):dst = cv.pyrDown(temp) #先对图像进行高斯平滑,然后再进行降采样(将图像尺寸行和列方向缩减一半)pyramid_images.append(dst) #在列表末尾添加新的对象cv.imshow("pyramid"+str(i+1), dst)temp = dst.copy()return pyramid_images
#拉普拉斯金字塔
def lapalian_demo(image):pyramid_images &#61; pyramid_demo(image) #做拉普拉斯金字塔必须用到高斯金字塔的结果level &#61; len(pyramid_images)for i in range(level-1, -1, -1):if (i-1) < 0:expand &#61; cv.pyrUp(pyramid_images[i], dstsize &#61; image.shape[:2])lpls &#61; cv.subtract(image, expand)cv.imshow("lapalian_down_"&#43;str(i&#43;1), lpls)else:expand &#61; cv.pyrUp(pyramid_images[i], dstsize &#61; pyramid_images[i-1].shape[:2])lpls &#61; cv.subtract(pyramid_images[i-1], expand)cv.imshow("lapalian_down_"&#43;str(i&#43;1), lpls)
src &#61; cv.imread(&#39;F:/test.jpg&#39;)
cv.namedWindow(&#39;input_image&#39;) #设置为WINDOW_NORMAL可以任意缩放
cv.imshow(&#39;input_image&#39;, src)
lapalian_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

显示结果&#xff1a;
高斯金字塔&#xff1a;
在这里插入图片描述
拉普拉斯金字塔&#xff1a;
在这里插入图片描述

融合

图像融合的目的就是使两幅图像的重叠区域过渡自然且平滑。
常见融合方法&#xff1a;

  • 1&#xff09;加权平均法。这个很好理解&#xff0c;即简单的使用加权的方式从左边过渡到右边。这种方法效果一般&#xff0c;但算法实现极其简单&#xff0c;速度快。
  • 2&#xff09;羽化算法 。这种方法过渡会比加权平均法自然&#xff0c;但会造成不好的模糊效果。
  • 3&#xff09;拉普拉斯金字塔融合。有的地方也称为多分辨率融合算法。这种方法是将图像建立一个拉普拉斯金字塔&#xff0c;其中金字塔的每一层都包含了图像不同的频段。分开不同频段进行融合效果出奇的好。

图像拉普拉斯金字塔分解的目的是将源图像分别分解到不同的空间频带上&#xff0c;融合过程是在各空间频率层上分别进行的&#xff0c;这样就可以针对不同分解层的不同频带上的特征与细节&#xff0c;采用不同的融合算子以达到突出特定频带上特征与细节的目的。即有可能将来自不同图像的特征与细节融合在一起。

实例2&#xff1a;利用拉普拉斯金字塔实现融合

代码&#xff1a;

import cv2
import numpy as np,sys
A &#61; cv2.imread(&#39;F:/ninny.jpg&#39;)
B &#61; cv2.imread(&#39;F:/nero.jpg&#39;)
# generate Gaussian pyramid for A
G &#61; A.copy()
gpA &#61; [G]
for i in range(6):G &#61; cv2.pyrDown(G)gpA.append(G)
# generate Gaussian pyramid for B
G &#61; B.copy()
gpB &#61; [G]
for i in range(6):G &#61; cv2.pyrDown(G)gpB.append(G)
# generate Laplacian Pyramid for A
lpA &#61; [gpA[5]]
for i in range(5,0,-1):GE &#61; cv2.pyrUp(gpA[i])L &#61; cv2.subtract(gpA[i-1],GE)lpA.append(L)
# generate Laplacian Pyramid for B
lpB &#61; [gpB[5]]
for i in range(5,0,-1):GE &#61; cv2.pyrUp(gpB[i])L &#61; cv2.subtract(gpB[i-1],GE)lpB.append(L)
# Now add left and right halves of images in each level
#numpy.hstack(tup)
#Take a sequence of arrays and stack them horizontally
#to make a single array.
LS &#61; []
for la,lb in zip(lpA,lpB):rows,cols,dpt &#61; la.shapels &#61; np.hstack((la[:,:cols//2], lb[:,cols//2:]))# ls &#61; np.hstack((la[:, :cols // 4], lb[:, cols // 4: cols//2], la[:, cols//2:3 * cols//4], lb[:, 3*cols//4: ]))LS.append(ls)
# now reconstruct
ls_ &#61; LS[0]
for i in range(1,6):ls_ &#61; cv2.pyrUp(ls_)ls_ &#61; cv2.add(ls_, LS[i])
# image with direct connecting each half
real &#61; np.hstack((A[:,:cols//2],B[:,cols//2:]))
# real &#61; np.hstack((A[:,:cols//4],B[:,cols//4: cols//2], A[:, cols//2: 3*cols//4], B[:, 3*cols//4: ]))
cv2.imwrite(&#39;F:/ninny_nero.jpg&#39;,ls_)
cv2.imwrite(&#39;F:/nini_chaochao.jpg&#39;,real)

结果&#xff1a;
使用拉普拉斯融合后的图片&#xff1a;

在这里插入图片描述
直接拼接的照片&#xff1a;

在这里插入图片描述

问题和解决&#xff1a;

  • 金字塔输入的图像大小必须是2的n次方。
  • 调试程序的时候遇到这个报错&#xff1a;

File "H:/pycharm_pro/pyramid/pyr.py", line 39, in ls &#61; np.hstack((la[:, :cols / 4], lb[:, cols // 4: cols//2], la[:, cols//2:3 * cols//4], lb[:, 3*cols//4: ]))
TypeError: slice indices must be integers or None or have an __index__ method

因为单纯的使用除法得到的可能不是整数&#xff0c;但是在索引过程中必须要使用整数索引&#xff0c;所以只取整数部分即可。


推荐阅读
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 本文介绍了使用Python根据字典中的值进行排序的方法,并给出了实验结果。通过将字典转化为记录项,可以按照字典中的值进行排序操作。实验结果显示,按照值进行排序后的记录项为[('b', 2), ('a', 3)]。 ... [详细]
  • 无损压缩算法专题——LZSS算法实现
    本文介绍了基于无损压缩算法专题的LZSS算法实现。通过Python和C两种语言的代码实现了对任意文件的压缩和解压功能。详细介绍了LZSS算法的原理和实现过程,以及代码中的注释。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 本文介绍了在Python中使用getpass模块隐藏密码输入的方法,以保护用户的密码不被其他人员看到。同时还提到了在PyCharm中运行该命令无效的问题,需要在terminal中运行。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • 本文介绍了蓝桥训练中的闰年判断问题,并提供了使用Python代码进行判断的方法。根据给定的年份,判断是否为闰年的条件是:年份是4的倍数且不是100的倍数,或者是400的倍数。根据输入的年份,输出结果为yes或no。本文提供了相应的Python代码实现。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
author-avatar
安彬2502936127
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有