图像金字塔原理

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

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

图像金字塔介绍

图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构。简单来说,图像金字塔就是用来进行图像缩放的。
进行图像缩放可以用图像金字塔,也可以使用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. [笔记] mysql5.6一些编译参数

    cmake \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DSYSCONFDIR=/etc \ -DWITH_INNOBASE_STORAGE_ENGINE ...

  2. 第10次Scrum会议(10/22)【欢迎来怼】

    一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,冉华小组照片 二.开会信息 时间:2017/10/22 17:20~17:33,总计13min.地点:东北师范 ...

  3. Mac安装jee开发环境,webservice环境搭建

    一.下载安装包 jdk(去官网下载) eclipse (去官网下载) tomcat(官网有9.0了)http://tomcat.apache.org/download-80.cgi#8.0.32 下载 ...

  4. CSS3:不可思议的border属性

    在CSS中,其border属性有很多的规则.对于一些事物,例如三角形或者其它的图像,我们仍然使用图片代替.但是现在就不需要了,我们可以用CSS形成一些基本图形,我分享了一些关于这方面的技巧. 1.正三 ...

  5. C++ Primer Plus学习:第十三章

    第十三章 类继承 继承的基本概念 类继承是指从已有的类派生出新的类.例: 表 0-1 player.h class player { private: string firstname; string ...

  6. [学习]WireShark 的过滤功能

    1. 打开 wireShark 过滤显示 协议 比如显示arp协议 过滤栏输入arp即可 支持的协议类型 TCP UDP HTTP FTP ICMP SMTP等等 2. 过滤ip地址 ip.addr ...

  7. 常用的一些sql

    --根据某一列中包括的逗号将一行数据变多行 select a,c from (with test as (select 'abc' a,'1,2,3' c from dual e) select a, ...

  8. VSVC2010中常用的C++11特性

    static_assert 声明 static_assert 声明在编译时测试软件断言,这与在运行时进行测试的其他断言机制不同. 如果断言失败,则编译也将失败,且系统将发出指定的错误消息. const ...

  9. Checkbox & Excel

    Checkbox & Excel Q: Excel how to check checkbox? 这个怎么打勾✔ ? A: 可以打勾的 How to Insert and Use a Chec ...

  10. CPU测试--通过proc获取CPU信息

    adb shell cat /proc/stat | grep cpu > totalcpu0 此处第一行的数值表示的是CPU总的使用情况,所以我们只要用第一行的数字计算就可以了.下表解析第一行 ...