原理 拉普拉斯金字塔_十三 高斯金字塔和拉普拉斯金字塔
一、图像金字塔原理
图像缩小(先高斯模糊,再降采样,需要一次次重复,不能一次到底)
图像扩大(先扩大,再卷积或者使用拉普拉斯金字塔)
图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构。简单来说,图像金字塔就是用来进行图像缩放的。
进行图像缩放可以用图像金字塔,也可以使用resize函数进行缩放,后者效果更好。这里只是对图像金字塔做一些简单了解。
二、金字塔类型:高斯和拉普拉斯
①高斯金字塔:用于下采样。高斯金字塔是最基本的图像塔。
原理:首先将原图像作为最底层图像G0(高斯金字塔的第0层),利用高斯核(5*5)对其进行卷积,然后对卷积后的图像进行下采样(去除偶数行和列)得到上一层图像G1,
将此图像作为输入,重复卷积和下采样操作得到更上一层图像,反复迭代多次,形成一个金字塔形的图像数据结构,即高斯金字塔。
②拉普拉斯金字塔:用于重建图像,也就是预测残差,对图像进行最大程度的还原。比如一幅小图像重建为一幅大图,
原理:用高斯金字塔的每一层图像减去其上一层图像上采样并高斯卷积之后的预测图像,得到一系列的差值图像即为 LP 分解图像。
三、采样类型:上采样和下采样
①上采样:就是图片放大(所谓上嘛,就是变大),使用PryUp函数。
上采样步骤:先将图像在每个方向放大为原来的两倍,新增的行和列用0填充,再使用先前同样的内核与放大后的图像卷积,获得新增像素的近似值。
②下采样:就是图片缩小(所谓下嘛,就是变小),使用PryDown函数。下采样将步骤:先对图像进行高斯内核卷积 ,再将所有偶数行和列去除。
总之,上、下采样都存在一个严重的问题,那就是图像变模糊了,因为缩放的过程中发生了信息丢失的问题。要解决这个问题,就得用拉普拉斯金字塔。
四、使用高斯金字塔实现下采样pyrDown
1、函数
pyrDown降采样
def pyrDown(src, dst=None, dstsize=None, borderType=None): #real signature unknown; restored from __doc__ --->dst
opencv的pyrDown函数先对图像进行高斯平滑,然后再进行降采样(将图像尺寸行和列方向缩减一半)。
src参数表示输入图像。
dst参数表示输出图像,它与src类型、大小相同。
dstsize参数表示降采样之后的目标图像的大小。
它是有默认值的,如果我们调用函数的时候不指定第三个参数,那么这个值是按照 Size((src.cols+1)/2, (src.rows+1)/2) 计算的。而且不管你自己如何指定这个参数,一定必须保证满足以下关系式:|dstsize.width * 2 - src.cols| ≤ 2; |dstsize.height * 2 - src.rows| ≤ 2。
也就是说降采样的意思其实是把图像的尺寸缩减一半,行和列同时缩减一半。
borderType参数表示表示图像边界的处理方式。
2、代码实现
1 importcv2 as cv2 importnumpy as np3
4 defdemo(image):5 level = 3
6 temp =image.copy()7 cv.imshow('temp',temp)8 demo_image =[] #一共有三个元素,元素类型是ndarray,shape分别为(288, 512, 3),(144, 256, 3),(72, 128, 3)9 for i inrange(level):10 #先对图像进行高斯平滑,然后再进行降采样(将图像尺寸行和列方向缩减一半)
11 dst =cv.pyrDown(temp)12 demo_image.append(dst)13 cv.imshow('demo%d'%i,dst)14 temp =dst.copy()15 print(demo_image.shape())16 src = cv.imread('1.jpg')17 demo(src)18 cv.waitKey(0)19 cv.destroyAllWindows()
五、使用拉普拉斯金字塔
1、pyrUp上采样
def pyrUp(src, dst=None, dstsize=None, borderType=None): #---> dst
opencv的pyrUp函数先对图像进行升采样(将图像尺寸行和列方向增大一倍),然后再进行高斯平滑。
src参数表示输入图像。
dst参数表示输出图像,它与src类型、大小相同。
dstsize参数表示降采样之后的目标图像的大小。
在默认的情况下,这个尺寸大小是按照 Size(src.cols*2, (src.rows*2) 来计算的。如果你自己要指定大小,那么一定要满足下面的条件:
|dstsize.width - src.cols * 2| ≤ (dstsize.width mod 2); //如果width是偶数,那么必须dstsize.width是src.cols的2倍
|dstsize.height - src.rows * 2| ≤ (dstsize.height mod 2);
borderType参数表示表示图像边界的处理方式。
2、代码实现
1 importcv2 as cv2 importnumpy as np3
4 defdemo(image):5 level = 3
6 temp =image.copy()7 cv.imshow('temp',temp)8 demo_image =[]9 for i inrange(level):10 #先对图像进行高斯平滑,然后再进行降采样(将图像尺寸行和列方向缩减一半)
11 dst =cv.pyrDown(temp)12 demo_image.append(dst)13 cv.imshow('demo%d'%i,dst)14 temp =dst.copy()15 returndemo_image16
17 deflap(image):18 lap_image = demo(image) #拉普拉斯需要用到高斯金字塔结果
19 level =len(lap_image)20 for i in range(level-1,-1,-1): #从后向前2,1,0
21 if (i-1) <0 :22 expand = cv.pyrUp(lap_image[i],dstsize=image.shape[:2]) #先上采样
23 lapls = cv.subtract(image,expand) #使用高斯金字塔上一个减去当前上采样获取的结果,才是拉普拉斯金字塔
24 else:25 expand = cv.pyrUp(lap_image[i],dstsize=lap_image[i-1].shape[:2])26 lapls = cv.subtract(lap_image[i-1],expand)27 cv.imshow('lapls%s'%i,lapls)28
29 src = cv.imread('1_512_512.jpg') #图片大小是512*512
30 cv.imshow('input',src)31 lap(src)32 cv.waitKey(0)33 cv.destroyAllWindows()
尝试直接输出expand不去subtract,会发现变模糊了
cv.imshow("lapls%s"%i,expand)
我们选用的图片大小必须是2^n大小,或者是一个宽高相等的图片!!!
原理 拉普拉斯金字塔_十三 高斯金字塔和拉普拉斯金字塔相关推荐
- python使用循环嵌套显示数字金字塔_如何使用Python生成数字金字塔?
在Python中使用数字生成金字塔有多种变体.让我们看一下两种最简单的形式 示例for i in range(5): for j in range(i + 1): print(j + 1, end=& ...
- Java动态规划走金字塔_【动态规划基础】数字金字塔
1258:[例9.2]数字金字塔 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 9635 通过数: 5467 [题目描述] 观察下面的数字金字塔.写一个程 ...
- matlab中表示拉普拉斯分布_分布拟合——正态/拉普拉斯/对数高斯/瑞利 分布
作者:桂. 时间:2017-03-16 20:30:20 声明:欢迎被转载,记得注明出处~ 前言 本文为曲线与分布拟合的一部分,主要介绍正态分布.拉普拉斯分布等常用分布拟合的理论推导以及代码实现. ...
- java编写数字金字塔_在java中的数字金字塔 (numbers pyramid in java)
最佳答案 英文原文 It might be a bit simpler to write and read if you make a separate method to print each li ...
- python用while写出金字塔_使用while循环的星金字塔python嵌套while循环
所以,让我们用算术的方法来处理这个问题.第一排需要一颗星,第二排需要两颗星,第三排需要三颗星等 换句话说,星的数目等于当前行索引(假设您的索引从1开始).Python的string format方法允 ...
- 行列式的拉普拉斯展开定理_如何证明行列式的拉普拉斯定理?
零.补充定义 为了表述准确并统一记号,先重新叙述以下众所周知的定义: 定义(子式. 阶子式):设 为任意 阶矩阵,(保序地)选取 的任意 行与 列(交叉处的元素)组成一个方阵,其行列式称为 的一个 阶 ...
- python金字塔_高斯金字塔与拉普拉斯金字塔的原理与python构建
高斯金字塔和拉普拉斯金字塔[1]在图像相关领域应用广泛,尤其是图像融合和图像分割方面.本文从理论和opencv实现两个方面对两种金字塔进行了介绍,并给出了二者的视觉效果. 1.高斯金字塔 在计算机视觉 ...
- 原理 拉普拉斯金字塔_图像金字塔(高斯金字塔、拉普拉斯金字塔)
1.图像金字塔 图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构. 图像金字塔最初用于机器视觉和图像压缩,一幅图像的金字塔是一系列以金字塔形状 ...
- 原理 拉普拉斯金字塔_图像金字塔分层算法
一. 图像金字塔概述 1. 图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构. 2. 图像金字塔最初用于机器视觉和图像压缩,一幅图像的金字塔是 ...
- matlab中表示拉普拉斯分布_深度优化局部拉普拉斯金字塔滤波器。
微信公众号:OpenCV学堂关注获取更多计算机视觉与深度学习知识 觉得文章有用,请戳底部[好看]支持 算法概述 基于局部拉普拉斯金字塔的Edge-aware滤波器是在2011年由Adobe 公司的研究 ...
最新文章
- Lambda表达式【转】
- hadoop2.x常用端口及定义方法
- easypoi导出数值型_SpringBoot使用EasyPoi进行数据导入导出Excel(一)
- 微信小程序——tab切换内容
- 玩转Mixly – 5、Arduino AVR编程 之 逻辑
- A Tutorial on Clustering Algorithms-聚类小知识
- 使用 XML Schema 定义元素的基本知识
- SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问的解决方案...
- MongoDB教程-使用Node.js从头开始CRUD应用
- linux上创建RAID(磁盘阵列)与LVM(逻辑盘)
- 怎样以最快的速度导入mysql
- c语言 iostream,C语言 我应该在哪里使用iostream类?
- 计195班学子博文目录
- 2018服务商口碑榜Top50(4月)重磅出炉
- python写自动化测试脚本常见报错_Python Appium自动化测试 MonkeyScript
- c语言中最大公约数的编程,C语言中最大公约数求法
- 伪随机数认识 以及 公平的抽奖
- springboot - vue-element-admin 整合,修改原有的登录退出
- 红帽linux设置自动启动,RedHat开机启动流程
- gbase 8d客户端功能事项