热门标签 | 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;所以只取整数部分即可。


推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了最长上升子序列问题的一个变种解法,通过记录拐点的位置,将问题拆分为左右两个LIS问题。详细讲解了算法的实现过程,并给出了相应的代码。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
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社区 版权所有