图像金字塔与图像融合——OpenCv

内容来自博客~

OpenCV中图像特征描述算法(SIFT,SURF,ORB等)中涉及了图像金字塔的内容。

  1. 高斯金字塔

高斯金字塔是最基本的图像塔。首先将原图像作为最底层图像G0(高斯金字塔的第0层,这里可以将原图像进行处理,最好处理成2的n次方,便于处理),利用高斯核(55)对其进行卷积,然后对卷积后的图像进行下采样(去除偶数行和列)得到上一层图像G1,将此图像作为输入,重复卷积和下采样操作得到更上一层图像,上一层图像是下一层图像的1/4 。、

反复迭代多次,形成一个金字塔形的图像数据结构,即高斯金字塔。换句话说就是:高斯金字塔的顶部是通过将底部图像中行和列按照相应规则去除而得到的。

高斯金字塔的构建过程为:

假设高斯金字塔的第L层图像为Gl:

式中N为高斯金字塔顶层层号,Rl和Cl分别为高斯金字塔第l层的行数和列数,W(m,n)是一个二维可分离的55窗口函数;

由G0,G1,… ,GN,就构成了一个高斯金字塔,其中G0为高斯金字塔的底层(与原图像相同)GN为金字塔的顶层。由此可见高斯金字塔的当前层图像就是对其前一层图像首先进行高斯低通滤波,然后再进行隔行和隔列的降2采样而生成的。

前一层图像大小依次为当前层图像大小的4倍。经过这样连续操作后,我们就会的到下图所示的一个分辨率不断下降的图像金字塔。(这个过程也类似于肉眼由进到远观看一幅图的清晰度过程)

OpenCV中提供了生成高斯金字塔的函数 pyrDown(src, dst=None, dstsize=None, borderType=None)pyrUp(src, dst=None, dstsize=None, borderType=None),cv2.pyrDown()从一个相对高分辨率的大尺寸的图像上构建一个金字塔,结果就是,图像变小,分辨率降低(降采样)。

而cv2.pyrUp()是一个上采样的过程,尽管相对尺寸变大,但是分辨率不会增加,图像会变得更模糊。

  1. 拉普拉斯金字塔

拉普拉斯金字塔可以由高斯金字塔计算得来,计算公式如下:(Li代表拉普拉斯金字塔的层数)

L(i) = G(i) − PyrUp( G(i+1) )
具体需要多少层需要视具体情况而定。

PS:此处在做图像矩阵减法得用cv2.subtract(img1,img2),因为对于元素类型为uint8 数据类型的图像矩阵而言,cv2.subtract(img1,img2)方法使得元素相减为负数时,该元素变为0。而img1 - img2元素相减为负数时,该元素为 255(显然不符合要求)。

  1. 重构

拉普拉斯金字塔的一个重要用是图像重建和融合,下图给出了利用拉式金字塔进行重建过程。

对融合后的拉普拉斯金字塔,从其顶层开始逐层从上至下按下式进行递推,可以恢复其对应的高斯金字塔,并最终可得到原图像G0。就是从最高层开始使用内插的方法。

图像融合

图像金字塔一个典型的应用就是图像融合。图像融合的实现步骤为:

  1. 读入两幅大小相同的图像 img1, img2
  2. 构建 img1 ,img2的 高斯金字塔,层数根据需要设定(这里定为6层)
  3. 根据高斯金字塔和拉普拉斯金字塔的关系,推出拉普拉斯金字塔的Li(也为6层,第一层大小和原图相同)
  4. 在拉普拉斯图层的每一层进行图像融合
  5. 根据融合后的图像金字塔重建原始图像
实现代码
import cv2 as cv
import numpy as npdef Pyramid(A,B):# 构建图一和图二高斯金字塔# A代表图一,B代表图二G=A.copy()G1=B.copy()gpA=[G]gpB=[G1]# 设定高斯金字塔的层数为6,作循环for i in range(6):# 分别降采样G=cv.pyrDown(G)G1=cv.pyrDown(G1)# print(G.shape)gpA.append(G)gpB.append(G1)# 构建图一的拉普拉斯金字塔LA=[gpA[5]]for i in range(5,0,-1):# 循环上采样LA.append(cv.subtract(gpA[i-1], cv.pyrUp(gpA[i])))# 构建图二的拉普拉斯金字塔LB=[gpB[5]]for i in range(5,0,-1):# 循环上采样LB.append(cv.subtract(gpB[i-1],cv.pyrUp(gpB[i])))# 将图一的左边和图二的右边无缝融合LeftA=[]RightA=[]Merge=[]for level in LA:LeftA.append(level[:, :int(level.shape[1]/2)])for level in LB:RightA.append(level[:, int(level.shape[1]/2):])for i in range(6):Merge.append(np.hstack((LeftA[i],RightA[i])))result=Merge[0]for i in range(1,6):# 循环上采样result=cv.pyrUp(result)result=cv.add(result,Merge[i])return resultif __name__=="__main__":img1=cv.imread("C:\\Users\\xxx\\Desktop\\one.png")img2=cv.imread("C:\\Users\\xxx\\Desktop\\two.png")rows,cols,dpt=img1.shapereal=np.hstack((img1[:, :int(cols/2)],img2[:, int(cols/2):]))cv.imshow("Direct", real)cv.imshow("Laplace", Pyramid(img1, img2))cv.waitKey(0)

效果图:(需要的两张图片size必须一致,但channel不能相同,否则报错…)

图片一致时:

Traceback (most recent call last):File "D:/codeBase/pythonCode/ImageMid.py", line 57, in <module>cv.imshow("Laplace", Pyramid(img1, img2))File "D:/codeBase/pythonCode/ImageMid.py", line 24, in PyramidLA.append(cv.subtract(gpA[i-1], cv.pyrUp(gpA[i])))
cv2.error: OpenCV(4.5.3) C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-q3d_8t8e\opencv\modules\core\src\arithm.cpp:650: error: (-209:Sizes of input arguments do not match) The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array' in function 'cv::arithm_op'

图片size不一致时:

Traceback (most recent call last):File "D:/codeBase/pythonCode/ImageMid.py", line 54, in <module>real=np.hstack((img1[:, :int(cols/2)],img2[:, int(cols/2):]))File "<__array_function__ internals>", line 5, in hstackFile "C:\Users\xxx\AppData\Local\Programs\Python\Python38\lib\site-packages\numpy\core\shape_base.py", line 345, in hstackreturn _nx.concatenate(arrs, 1)File "<__array_function__ internals>", line 5, in concatenate
ValueError: all the input array dimensions for the concatenation axis must match exactly, but along dimension 0, the array at index 0 has size 2337 and the array at index 1 has size 1514

分析: 参照相关文档,对比了直接融合 与 通过拉式金字塔融合效果。拉式金字塔牺牲了清晰度,换来了无缝连接。但直接连接有明显的缝隙。

初次编写于2021年8月18日。

图像金字塔与图像融合——OpenCv库相关推荐

  1. opencv进阶学习笔记10:图像金字塔和图像梯度

    基础版笔记传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 图像金字塔 变小 变大 原理 ...

  2. opencv学习笔记19:图像金字塔和图像拉普拉斯金字塔 (用于图像放大和缩小)

    图像金字塔原理 图像金字塔:只不同分辨率,不同尺寸子图构成的集合. 取样 向下取样:有一个图像G0,对它重新采样,得到分辨率小些的G1,以此类推. 向上取样:有一个图像G3,然后变成像素更多的G2,以 ...

  3. 滤波、漫水填充、图像金字塔、图像缩放、阈值化

      imgpro 组件是 Image 和 Process 这两个单词的缩写组合,即图像处理模块,这个模块包含了如下内容: 文章目录 1.线性滤波:方框滤波.均值滤波.高斯滤波 1.1 平滑处理 1.2 ...

  4. [Python图像处理] 二十一.图像金字塔之图像向下取样和向上取样

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  5. 跟我学Python图像处理丨关于图像金字塔的图像向下取样和向上取样

    摘要:本文讲述图像金字塔知识,了解专门用于图像向上采样和向下采样的pyrUp()和pyrDown()函数. 本文分享自华为云社区<[Python图像处理] 二十一.图像金字塔之图像向下取样和向上 ...

  6. OpenCV-利用图像金字塔合并图像

    目录 前言 操作步骤 原图 1.导入所需库 2.读取所需数据 进行图片处理 显示结果 最终结果 前言 图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构.一幅图像的金字 ...

  7. 图像金字塔实现图像缩放_一个简单的VueJS组件,用于图像放大/产品缩放

    图像金字塔实现图像缩放 Vue放大镜 (vue-magnifier) Vue Magnifier is free component for basic image zoom practices. Y ...

  8. python opencv创建图像_使用Python中OpenCV库创建一幅图片的RGB通道图片

    我们知道,在使用PhotoShop进行图片的抠取.创建和存储选区.存储图像的色彩资料等复杂操作时,经常会用到一个功能,那就是"RGB"通道,它能从三原色角度对一幅图片进行精准处理. ...

  9. 我对图像金字塔的理解及OpenCV下的实现代码

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 图像金字塔算法表现出来的效果就是对图像进行缩放嘛 ...

最新文章

  1. python把桢写入txt_Java 字节码与字节码分析
  2. Centos-启动network报错RTNETLINK answers: File exists解决方法
  3. Docker CE for CentOS的安装(对官方文档的翻译)
  4. why2cs学习之路
  5. 判别器loss为0_scikitlearn—线性判别分析和二次判别分析
  6. 机器学习- 吴恩达Andrew Ng Week9 知识总结 Recommender Systems
  7. 1分钟教会你cad如何转pdf
  8. Zabbix使用snmptrap方式监控vCenter Server
  9. 逆向工具IDA下载网址
  10. 笔记本有线及无线的MAC地址修改
  11. Qt5构建出错问题解决办法:为项目untitled执行步骤
  12. 详解圆形头像Shader
  13. WPSOffice双面文档打印边距设置技巧(转)
  14. Java代码实现数字签名验证
  15. 常用的六大类型测试工具
  16. 论文分哪几个级别(二)
  17. latex 二重积分、三重积分、闭合积分公式
  18. 乘风破浪,一往无前 – Smartbi和你一起走过的2020年
  19. 9、乐趣国学—践行《弟子规》的“谨”懂得从容之道(上篇)
  20. 齐鲁工业大学计算机科学与技术专业分数线,齐鲁工业大学计算机科学与技术专业2017年在山西理科高考录取最低分数线...

热门文章

  1. 23模式--建造者模式
  2. 【华为OD机试真题】促销活动(货币兑换)100%通过率
  3. python学法用法 自动刷分_使用python对微信小游戏跳一跳刷分
  4. 互联网电影院5G让3D体验更流畅
  5. 修改电脑C:\User\用户名文件夹的名字
  6. 用什么方法可以将Word转换成PDF文档?
  7. OPPOR9plusmA_官方线刷包_救砖包_解账户锁
  8. Cocos Creator 热更新文件MD5计算和需要注意的问题
  9. 奇安信代码安全实验室招人啦!
  10. matlab中参数估计,关于matlab的参数估计