图像金字塔原理

(一)图像缩小(先高斯模糊,再降采样,需要一次次重复,不能一次到底)

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

图像金字塔介绍

图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构。简单来说,图像金字塔就是用来进行图像缩放的。
进行图像缩放可以用图像金字塔,也可以使用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---图像金字塔原理的更多相关文章

  1. Atitit 图像金字塔原理与概率 attilax的理解总结qb23

    Atitit 图像金字塔原理与概率 attilax的理解总结qb23 1.1. 高斯金字塔  (  Gaussianpyramid): 拉普拉斯金字塔 (Laplacianpyramid):1 1.2 ...

  2. OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

    这篇已经写得很好,真心给作者点个赞.题目都是直接转过来的,直接去看吧. Reference Link : http://blog.csdn.net/poem_qianmo/article/detail ...

  3. 【OpenCV新手教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨) ...

  4. 学习 opencv---(12)OpenCV 图像金字塔:高斯金字塔,拉普拉斯金字塔与图片尺寸缩放

    在这篇文章里,我们一起学习下 图像金字塔 的一些基本概念,如何使用OpenCV函数pyrUp和pyrDown 对图像进行向上和向下采样,以及了解专门用于缩放图像尺寸的resize函数的用法.此博文一共 ...

  5. OpenCV图像金字塔

    图像金字塔 目标 本文档尝试解答如下问题: 如何使用OpenCV函数 pyrUp 和 pyrDown 对图像进行向上和向下采样. 原理 Note 以下内容来自于Bradski和Kaehler的大作:  ...

  6. OpenCV——图像金字塔和图片尺寸缩放

  7. opencv 4 图像处理(漫水填充,图像金字塔与图片尺寸缩放,阈(yu)值化)

    漫水填充 实现漫水填充算法:floodFill函数 简单调用范例 #include <opencv2/opencv.hpp> #include <opencv2/imgproc/im ...

  8. opencv python:图像金字塔

    图像金字塔原理 expand = 扩大+卷积 拉普拉斯金字塔 PyrDown:降采样 PyrUp:还原 example import cv2 as cv import numpy as np # 图像 ...

  9. 图像金字塔及其在 OpenCV 中的应用范例(下)

    前言 本文将主要讲解如何使用 OpenCV 实现图像分割,这也是图像金字塔在 OpenCV 中的一个重要应用. 关于图像分割 在计算机视觉领域,图像分割(Segmentation)指的是将数字图像细分 ...

随机推荐

  1. openresty 安装指南

    对于一些常见的 Linux 发行版本,OpenResty 提供 官方预编译包.确保你首先用这种方式来安装. 如果您还没有下载 OpenResty 的源码包, 请到 Download 页下载. 首先,您 ...

  2. loadrunner--基础2

    LR11-03 一.并发测试(n VU) 1.并发测试两个条件 1)脚本中要有 集合点(并发点) 2)控制台中要设置并发策略(选择第一项,所有虚拟用户到达集合点后释放) 集合点: 5个线程,代表5个V ...

  3. Scrum立会报告+燃尽图(十月十八日总第九次):功能细化与数据库设计

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2246 项目地址:https://git.coding.net/zhang ...

  4. 定制自己的动画 View 控件(Canvas 使用)

    定制自己的动画 View 控件(Canvas 使用) 如果要定义自己的 View 控件,则需要新建一个类继承 android.view.View.然后在 onDraw 中写自己需要实现的方式. 这里定 ...

  5. c# 调用c++dll二次总结

    1.pinvoke结构不对称,添加语句(网上有) 2.含回调函数,成员参数的结构体必须完全,尽管自己用不到. 3.加深对c++指针的理解.一般情况下,类型加*等效于c++中的ref.但对于short* ...

  6. P4语法(4)Control block

    Control block Control block之中用于放置设计好的Table和Action. 可以把control block认为是pipeline的一个模板,之前用的v1model中就是in ...

  7. HDU 1121 Complete the Sequence 差分

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1121 Complete the Sequence Time Limit: 3000/1000 MS ...

  8. HDU 1257 最少拦截系统(最长递减子序列的条数)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1257 题解: #include<iostream> #include<cstdio ...

  9. 【前端学习笔记】JavaScript 小案例合集

    获取一个0-9的随机数: Math.round(Math.random()*9); 去除数组中重复的元素: var arr=[1,3,5,4,3,3,1,4] function editArr(arr ...

  10. 【数据库】mysql中复制表结构的方法小结

    mysql中用命令行复制表结构的方法主要有一下几种: 1.只复制表结构到新表 ? 1 CREATE TABLE 新表 SELECT * FROM 旧表 WHERE 1=2 或者 ? 1 CREATE ...