OpenCV---图像金字塔原理
图像金字塔原理
(一)图像缩小(先高斯模糊,再降采样,需要一次次重复,不能一次到底)

(二)图像扩大(先扩大,再卷积或者使用拉普拉斯金字塔)


图像金字塔介绍
图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构。简单来说,图像金字塔就是用来进行图像缩放的。
进行图像缩放可以用图像金字塔,也可以使用resize函数进行缩放,后者效果更好。这里只是对图像金字塔做一些简单了解。
金字塔类型:高斯和拉普拉斯
①高斯金字塔:用于下采样。高斯金字塔是最基本的图像塔。
原理:首先将原图像作为最底层图像G0(高斯金字塔的第0层),利用高斯核(*)对其进行卷积,然后对卷积后的图像进行下采样(去除偶数行和列)得到上一层图像G1,
将此图像作为输入,重复卷积和下采样操作得到更上一层图像,反复迭代多次,形成一个金字塔形的图像数据结构,即高斯金字塔。
②拉普拉斯金字塔:用于重建图像,也就是预测残差,对图像进行最大程度的还原。比如一幅小图像重建为一幅大图,
原理:用高斯金字塔的每一层图像减去其上一层图像上采样并高斯卷积之后的预测图像,得到一系列的差值图像即为 LP 分解图像。
采样类型:上采样和下采样
①上采样:就是图片放大(所谓上嘛,就是变大),使用PryUp函数。
上采样步骤:先将图像在每个方向放大为原来的两倍,新增的行和列用0填充,再使用先前同样的内核与放大后的图像卷积,获得新增像素的近似值。
②下采样:就是图片缩小(所谓下嘛,就是变小),使用PryDown函数。下采样将步骤:先对图像进行高斯内核卷积 ,再将所有偶数行和列去除。
总之,上、下采样都存在一个严重的问题,那就是图像变模糊了,因为缩放的过程中发生了信息丢失的问题。要解决这个问题,就得用拉普拉斯金字塔。
一:使用高斯金字塔实现下采样pyrDown
import cv2 as cv
import numpy as np def pyramid_demo(image):
level =
temp = image.copy()
pyramid_images = []
for i in range(level):
dst = cv.pyrDown(temp) #先对图像进行高斯平滑,然后再进行降采样(将图像尺寸行和列方向缩减一半)
pyramid_images.append(dst)
cv.imshow("pyramid_demo_%s"%i,dst)
temp = dst.copy() src = cv.imread("./1.png") #读取图片
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE) #创建GUI窗口,形式为自适应
cv.imshow("input image",src) #通过名字将图像和窗口联系
pyramid_demo(src)
cv.waitKey() #等待用户操作,里面等待参数是毫秒,我们填写0,代表是永远,等待用户操作
cv.destroyAllWindows() #销毁所有窗口

二:使用拉普拉斯金字塔
def pyramid_demo(image):
level =
temp = image.copy()
pyramid_images = []
for i in range(level):
dst = cv.pyrDown(temp) #先对图像进行高斯平滑,然后再进行降采样(将图像尺寸行和列方向缩减一半)
pyramid_images.append(dst)
cv.imshow("pyramid_demo_%s"%i,dst)
temp = dst.copy()
return pyramid_images def lapalian_demo(image):
pyramid_images = pyramid_demo(image) #拉普拉斯需要用到高斯金字塔结果
level = len(pyramid_images)
for i in range(level-,-,-): #从后向前2,,
if (i-) < :
expand = cv.pyrUp(pyramid_images[i], dstsize=image.shape[:2]) #先上采样
lapls = cv.subtract(image, expand) #使用高斯金字塔上一个减去当前上采样获取的结果,才是拉普拉斯金字塔
else:
expand = cv.pyrUp(pyramid_images[i],dstsize=pyramid_images[i-1].shape[:2])
lapls = cv.subtract(pyramid_images[i-1],expand)
cv.imshow("lapls_down_%s"%i,lapls) src = cv.imread("./a1.jpg") #读取图片
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE) #创建GUI窗口,形式为自适应
cv.imshow("input image",src) #通过名字将图像和窗口联系
lapalian_demo(src)
cv.waitKey() #等待用户操作,里面等待参数是毫秒,我们填写0,代表是永远,等待用户操作
cv.destroyAllWindows() #销毁所有窗口

尝试直接输出expand不去subtract
cv.imshow("lapls_down_%s"%i,expand)

变模糊了
注意:
我们选用的图片大小必须是2^n大小,或者是一个宽高相等的图片
OpenCV(3.4.) Error: Assertion failed (std::abs(dsize.width - ssize.width*) == dsize.width % && std::abs(dsize.height - ssize.height*) == dsize.height % ) in cv::pyrUp_, file C:\projects\opencv-python\opencv\modules\imgproc\src\pyramids.cpp, line
Traceback (most recent call last):
File "D:/MyPython/day25/pv/op11.py", line , in <module>
lapalian_demo(src)
File "D:/MyPython/day25/pv/op11.py", line , in lapalian_demo
expand = cv.pyrUp(pyramid_images[i],dstsize=pyramid_images[i-].shape[:])
cv2.error: OpenCV(3.4.) C:\projects\opencv-python\opencv\modules\imgproc\src\pyramids.cpp:: error: (-) std::abs(dsize.width - ssize.width*) == dsize.width % && std::abs(dsize.height - ssize.height*) == dsize.height % in function cv::pyrUp_
相关知识补充:
(一)pyrDown降采样
def pyrDown(src, dst=None, dstsize=None, borderType=None): # real signature unknown; restored from __doc__
opencv的pyrDown函数先对图像进行高斯平滑,然后再进行降采样(将图像尺寸行和列方向缩减一半)。其函数原型为:pyrDown(src[, dst[, dstsize[, borderType]]]) -> dst src参数表示输入图像。 dst参数表示输出图像,它与src类型、大小相同。 dstsize参数表示降采样之后的目标图像的大小。它是有默认值的,如果我们调用函数的时候不指定第三个参数,那么这个值是按照 Size((src.cols+)/, (src.rows+)/) 计算的。而且不管你自己如何指定这个参数,一定必须保证满足以下关系式:|dstsize.width * - src.cols| ≤ ; |dstsize.height * - src.rows| ≤ 。也就是说降采样的意思其实是把图像的尺寸缩减一半,行和列同时缩减一半。 borderType参数表示表示图像边界的处理方式。
(二)pyrUp上采样
def pyrUp(src, dst=None, dstsize=None, borderType=None): # real signature unknown; restored from __doc__
opencv的pyrUp函数先对图像进行升采样(将图像尺寸行和列方向增大一倍),然后再进行高斯平滑。其函数原型为:pyrUp(src[, dst[, dstsize[, borderType]]]) -> dst src参数表示输入图像。 dst参数表示输出图像,它与src类型、大小相同。 dstsize参数表示降采样之后的目标图像的大小。在默认的情况下,这个尺寸大小是按照 Size(src.cols*, (src.rows*) 来计算的。如果你自己要指定大小,那么一定要满足下面的条件: |dstsize.width - src.cols * | ≤ (dstsize.width mod ); //如果width是偶数,那么必须dstsize.width是src.cols的2倍 |dstsize.height - src.rows * | ≤ (dstsize.height mod ); borderType参数表示表示图像边界的处理方式。
OpenCV---图像金字塔原理的更多相关文章
- Atitit 图像金字塔原理与概率 attilax的理解总结qb23
Atitit 图像金字塔原理与概率 attilax的理解总结qb23 1.1. 高斯金字塔 ( Gaussianpyramid): 拉普拉斯金字塔 (Laplacianpyramid):1 1.2 ...
- OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放
这篇已经写得很好,真心给作者点个赞.题目都是直接转过来的,直接去看吧. Reference Link : http://blog.csdn.net/poem_qianmo/article/detail ...
- 【OpenCV新手教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨) ...
- 学习 opencv---(12)OpenCV 图像金字塔:高斯金字塔,拉普拉斯金字塔与图片尺寸缩放
在这篇文章里,我们一起学习下 图像金字塔 的一些基本概念,如何使用OpenCV函数pyrUp和pyrDown 对图像进行向上和向下采样,以及了解专门用于缩放图像尺寸的resize函数的用法.此博文一共 ...
- OpenCV图像金字塔
图像金字塔 目标 本文档尝试解答如下问题: 如何使用OpenCV函数 pyrUp 和 pyrDown 对图像进行向上和向下采样. 原理 Note 以下内容来自于Bradski和Kaehler的大作: ...
- OpenCV——图像金字塔和图片尺寸缩放
- opencv 4 图像处理(漫水填充,图像金字塔与图片尺寸缩放,阈(yu)值化)
漫水填充 实现漫水填充算法:floodFill函数 简单调用范例 #include <opencv2/opencv.hpp> #include <opencv2/imgproc/im ...
- opencv python:图像金字塔
图像金字塔原理 expand = 扩大+卷积 拉普拉斯金字塔 PyrDown:降采样 PyrUp:还原 example import cv2 as cv import numpy as np # 图像 ...
- 图像金字塔及其在 OpenCV 中的应用范例(下)
前言 本文将主要讲解如何使用 OpenCV 实现图像分割,这也是图像金字塔在 OpenCV 中的一个重要应用. 关于图像分割 在计算机视觉领域,图像分割(Segmentation)指的是将数字图像细分 ...
随机推荐
- MySQL 中的数据类型介绍
1.MySQL 数据类型 MySQL中定义数据字段的类型对你数据库的优化是非常重要的. MySQL支持多种类型,大致可以分为三类:数值.日期/时间和字符串(字符)类型. 2.数值类型(12) 2.1. ...
- spring mvc ajaxfileupload文件上传返回json下载问题
问题:使用spring mvc ajaxfileupload 文件上传在ie8下会提示json下载问题 解决方案如下: 服务器代码: @RequestMapping(value = "/ad ...
- USACO 1.3.4 Prime Cryptarithm 牛式(模拟枚举)
Description 下面是一个乘法竖式,如果用我们给定的那n个数字来取代*,可以使式子成立的话,我们就叫这个式子牛式. * * * x * * ------- * * * * * * ------ ...
- 四则运算3+psp0
题目要求: 1.程序可以判断用户的输入答案是否正确,如果错误,给出正确答案,如果正确,给出提示. 2.程序可以处理四种运算的混合算式. 3.要求两人合作分析,合作编程,单独撰写博客. 团队成员:张绍佳 ...
- “我爱淘”第二冲刺阶段Scrum站立会议4
完成任务: 完成了首页中的推荐功能,推荐的是最近添加的需要卖的书,注册功能实现了它,可以对数据库进行添加. 计划任务: 在客户端实现分类功能,通过学院的分类查看书籍. 遇到问题: 分类功能,根据不同学 ...
- 从一个app开始学iOS
在大学上了4年学,老师一直给灌输的思想就是,从细微处着手最后看到整体.举个网站的例子.第一个学期老师安排一门课java语言,期末考试就是考试java语言的知识.第二学期java web,第一次课配置j ...
- 软工实践-Alpha 冲刺 (7/10)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 已经解决登录注册等基本功能的界面. 完成非功能的主界面制作 ...
- a5
今日内容: 今天主要还是素材的查找,图标的制作以及调整. 明日计划: 主要还是完成图标,尽可能的美化 困难: 一个是直男式的审美吧,另一个是PS的技术还不够深
- nodepad++ 格式化xml插件
1.用插件管理器安装xmltools插件 2.使用如下菜单格式化xml: 所有插件下载地址: http://sourceforge.net/projects/npp-plugins/files/
- texbbox,combobox设置属性
--输入框 $("#xx").textbox('setValue','value'); //设置输入框的值 $('#xx').textbox('textbox').attr('r ...