一、尺度调整

顾名思义,即对源图像的尺寸进行放大或者缩小变换。在opencv里面可以用resize函数,将源图像精准地转化为指定尺寸的目标图像。要缩小图像,一般推荐使用CV_INETR_AREA(区域插值)来插值;若要放大图像,推荐使用CV_INTER_LINEAR(线性插值)。这个函数可以用来做简单的图像尺度变换。而下面要说的图像金字塔的用处很大,在特征检测中都是基础理论和技术;

Opencv里面的API介绍:

void resize(src,dst,size,int interpolation)
//src:源图像;dst:目标图像,
//size目标图像大小,可以是指定的尺寸或者放大缩小的比例
//指定插值方式,一般有四种插值方式可供选择,默认为线性插值法

二、图像金字塔(Image Pyramid)

       图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构。图像金字塔最初用于机器视觉和图像压缩,一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。

常见两类图像金字塔

  • 高斯金字塔 ( Gaussian pyramid): 用来向下/降采样,主要的图像金字塔
  • 拉普拉斯金字塔(Laplacian pyramid): 用来从金字塔低层图像重建上层未采样图像,在数字图像处理中也即是预测残差,可以对图像进行最大程度的还原,配合高斯金字塔一起使用。                                                                                                                          

两者的简要区别:高斯金字塔用来向下降采样图像,注意降采样其实是由金字塔底部向上采样,分辨率降低,它和我们理解的金字塔概念相反(注意);而拉普拉斯金字塔则用来从金字塔底层图像中向上采样重建一个图像。

要从金字塔第i层生成第i+1层(我们表示第i+1层为G_i+1),我们先要用高斯核对G_1进行卷积,然后删除所有偶数行和偶数列。新得到图像面积会变为源图像的四分之一。按上述过程对输入图像G_0执行操作就可产生出整个金字塔。

当图像向金字塔的上层移动时,尺寸和分辨率就降低。OpenCV中,从金字塔中上一级图像生成下一级图像的可以用PryDown。而通过PryUp将现有的图像在每个维度都放大两遍。

图像金字塔中的向上和向下采样分别通过OpenCV函数 pyrUp 和 pyrDown 实现。概括起来就是:

  • 对图像向上采样:pyrUp函数
  • 对图像向下采样:pyrDown函数

这里的向下与向上采样,是对图像的尺寸而言的(和金字塔的方向相反),向上就是图像尺寸加倍,向下就是图像尺寸减半。而如果我们按上图中演示的金字塔方向来理解,金字塔向上图像其实在缩小,这样刚好是反过来了。

但需要注意的是,PryUp和PryDown不是互逆的,即PryUp不是降采样的逆操作。这种情况下,图像首先在每个维度上扩大为原来的两倍,新增的行(偶数行)以0填充。然后给指定的滤波器进行卷积(实际上是一个在每个维度都扩大为原来两倍的过滤器)去估计“丢失”像素的近似值。PryDown( )是一个会丢失信息的函数。为了恢复原来更高的分辨率的图像,我们要获得由降采样操作丢失的信息,这些数据就和拉普拉斯金字塔有关系了。

2.1 高斯金字塔(Gaussian pyramid)

高斯金字塔是通过高斯平滑和亚采样获得一系列下采样图像,也就是说第K层高斯金字塔通过平滑、亚采样就可以获得K+1层高斯图像,高斯金字塔包含了一系列低通滤波器,其截至频率从上一层到下一层是以因子2逐渐增加,所以高斯金字塔可以跨越很大的频率范围。金字塔的图像如下:

另外,每一层都按从下到上的次序编号, 层级 G_i+1 (表示为 G_i+1尺寸小于第i层G_i)。

  • 对图像的向下取样操作,即缩小图像。

为了获取层级为 G_i+1 的金字塔图像,方法步骤如下:

<1> 对图像G_i进行高斯内核卷积,进行高斯模糊;

<2> 将所有偶数行和列去除。

得到的图像即为G_i+1的图像,显而易见,结果图像只有原图的四分之一。通过对输入图像G_i(原始图像)不停迭代以上步骤就会得到整个金字塔。同时我们也可以看到,向下取样会逐渐丢失图像的信息。以上就是对图像的向下取样操作,即缩小图像。

  • 对图像的向上取样,即放大图像

方法步骤如下:

<1> 将图像在每个方向扩大为原来的两倍,新增的行和列以0填充

<2> 使用先前同样的内核(乘以4)与放大后的图像卷积,获得 “新增像素”的近似值

得到的图像即为放大后的图像,但是与原来的图像相比会发觉比较模糊,因为在缩放的过程中已经丢失了一些信息,如果想在缩小和放大整个过程中减少信息的丢失,这些数据形成了拉普拉斯金字塔。

2.2 拉普拉斯金字塔(Laplacian pyramid)

拉普拉斯金字塔第i层的数学定义:

式中的表示第i层的图像。而UP()操作是将源图像中位置为(x,y)的像素映射到目标图像的(2x+1,2y+1)位置,即在进行向上取样。符号表示卷积,为5x5的高斯内核。

pryUp,就是在进行上面这个式子的运算。因此,可以直接用OpenCV进行拉普拉斯运算:

将降采样之后的图像再进行上采样操作,然后与之前还没降采样的原图进行做差得到残差图!为还原图像做信息的准备!

也就是说,拉普拉斯金字塔是通过源图像减去先缩小后再放大的图像的一系列图像构成的。保留的是残差!为图像还原做准备!

整个拉普拉斯金字塔运算过程可以通过下图来概括:

所以,我们可以将拉普拉斯金字塔理解为高斯金字塔的逆形式。

另外再提一点,关于图像金字塔非常重要的一个应用就是实现图像分割。图像分割的话,先要建立一个图像金字塔,然后在G_i和G_i+1的像素直接依照对应的关系,建立起”父与子“关系。而快速初始分割可以先在金字塔高层的低分辨率图像上完成,然后逐层对分割加以优化。

注意:上采样和下采样是非线性处理,不可逆,有损的处理!

2.3 DOG金字塔(Difference of Gaussian-DOG)

 通俗描述:就是把同一张图像在不同的参数下做高斯模糊之后的结果相减,得到的输出图像。称为高斯不同(DOG)。高斯不同是图像的内在特征,在灰度图像增强、角点检测中经常用到

理论描述:差分金字塔,DOG(Difference of Gaussian)金字塔是在高斯金字塔的基础上构建起来的,其实生成高斯金字塔的目的就是为了构建DOG金字塔。DOG金字塔的第1组第1层是由高斯金字塔的第1组第2层减第1组第1层得到的。以此类推,逐组逐层生成每一个差分图像,所有差分图像构成差分金字塔。概括为DOG金字塔的第0组第l层图像是由高斯金字塔的第0组第i+1层减第0组第i层得到的。

DOG金字塔的构建可以用下图描述:

每一组在层数上,DOG金字塔比高斯金字塔少一层。后续Sift特征点的提取都是在DOG金字塔上进行的。

//金字塔(图像的上采样和降采样)
//图像金字塔:图像金字塔是一种以多分辨率来解释图像的有效但概念简单的结构。应用于图像分割,机器视觉和图像压缩。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,
//且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似。
//我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。#include "stdafx.h"
#include<opencv2/opencv.hpp>
#include<iostream>using namespace cv;int main(int argc, int argv)
{Mat src, dst, dst1;src = imread("C:\\Users\\59235\\Desktop\\imag\\girl1.jpg");if (!src.data){printf("could not load image...\n");}namedWindow("input", CV_WINDOW_AUTOSIZE);imshow("input", src);//上采样(zoom in 放大)pyrUp(src, dst, Size(src.cols * 2, src.rows * 2));imshow("zoom in", dst);//降采样(zoom out 缩小)pyrDown(src, dst1, Size(src.cols / 2, src.rows / 2));imshow("zoom out", dst1);/*dst = src;dst1 = dst;/// 循环while (true){int c;c = waitKey(50);if ((char)c == 27){break;}if ((char)c == 'u'){pyrUp(dst, dst1, Size(dst.cols * 2, dst.rows * 2));printf("** Zoom In: Image x 2 \n");//imshow("Zoom In", dst1);}else if ((char)c == 'd'){pyrDown(dst, dst1, Size(dst.cols / 2, dst.rows / 2));printf("** Zoom Out: Image / 2 \n");//imshow("Zoom Out", dst1);}imshow("Zoom Out", dst1);dst = dst1;}return 0;*///高斯不同DOG(different of gaussian)//就是把同一张图像在不同的参数下做高斯模糊之后的结果相减,得到的输出图像;高斯不同是图像的内在特征,在灰度图像增强、角点检测中经常用到。Mat gray_src, dst2, dst3, dog_Image;cvtColor(src, gray_src, CV_BGR2GRAY);GaussianBlur(gray_src, dst2, Size(3, 3), 0, 0);imshow("dst2..", dst2);GaussianBlur(dst2, dst3, Size(3, 3), 0, 0);imshow("dst3..", dst3);subtract(dst2, dst3, dog_Image);//归一化显示normalize(dog_Image, dog_Image, 255, 0, NORM_MINMAX);//src输入;dst输出,支持原地运算;alpha:range normalization模式的最小值;beta:range normalization模式的最大值,不用于norm normalization(范数归一化)模式。//normType//归一化的类型,可以有以下的取值://NORM_MINMAX : 数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。//NORM_INF : 此类型的定义没有查到,根据OpenCV 1的对应项,可能是归一化数组的C - 范数(绝对值的最大值)//NORM_L1 : 归一化数组的L1 - 范数(绝对值的和)//NORM_L2 : 归一化数组的(欧几里德)L2 - 范数namedWindow("result", CV_WINDOW_AUTOSIZE);imshow("result", dog_Image);waitKey(0);return 0;
}

效果图:

1降采样:

2上采样

分析: 图像经过一次下采样后尺寸变为原来的1/4,由高分辨率变为低分辨率的图像;而且由于下采样过程会丢失信息,所以对降采样后的图像进行上采样重建时会发现,重建后的图像变得模糊。

3 拉普拉斯金字塔

分析:拉普拉斯金字塔代表着高斯金字塔进行下采样时丢失的信息。

4 高斯不同                                                     (差分金字塔第一组第一层)

 (差分金字塔第一组第二层)

分析:同一张图像在不同的参数下做高斯模糊之后的结果相减,得到的输出图像,即高斯不同图像。SIFT特征点的提取都是在DOG金字塔上进行的。

【OpenCV学习笔记】之图像金字塔(Image Pyramid)相关推荐

  1. C++下opencv学习笔记(一)(图像的简单读取丶显示与存储)

    C++下opencv学习笔记(一)(图像的简单读取丶显示与存储) 前言 学习C++ OpenCV,第一需要具备面向对象语言的基础,第二要对图像处理机器学习有基础了解,容易入门.觉得自己基础已经有了可以 ...

  2. OpenCV学习笔记(九)——图像轮廓(下)

    <OpenCV轻松入门:面向Python>学习笔记(九) 1-3 查找并绘制轮廓.矩特性及Hu矩 4-5 轮廓拟合及凸包 6. 利用形状场景算法比较轮廓 6.1 计算形状场景距离 6.2 ...

  3. Opencv学习笔记(八) -- 图像色彩空间转换

    1.常见图像色彩空间 RGB RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.绿.蓝三个通道 ...

  4. OpenCV学习笔记(七)——图像梯度及边缘检测

    图像梯度计算的是图像变化的速度.对于图像的边缘部分,其灰度值变化较大,梯度值也较大:相反,对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度值也较小.一般情况下,图像梯度计算的是图像的边缘信息. ...

  5. 【opencv学习】【图像金字塔】

    今天简单学习下图像金字塔,说白了就是图像放大缩小的一些方法,但是是等比例的. import cv2 import numpy as np# 展示图像,封装成函数 def cv_show_image(n ...

  6. [OpenCV学习笔记3][图像的加载+修改+显示+保存]

    正式进入OpenCV学习了,前面开始的都是一些环境搭建和准备工作,对一些数据结构的认识主要是Mat类的认识: [1.学习目标] 图像的加载:imread() 图像的修改:cvtColor() 图像的显 ...

  7. OpenCV学习笔记之图像融合

    一.线性融合操作 线性混合操作 也是一种典型的二元(两个输入)的 像素操作 : 通过在范围  内改变  ,这个操可以用来对两幅图像或两段视频产生时间上的 画面叠化 (cross-dissolve)效果 ...

  8. OpenCV学习笔记五-图像混合

    将两张图片混合 P6 图像混合 #include<iostream> #include<opencv2/opencv.hpp>using namespace std; usin ...

  9. Opencv学习笔记四——图像形态学操作

    需要的库和自定义函数 import cv2 import numpy as np import matplotlib.pyplot as pltdef cv_show(name, mat):cv2.i ...

  10. (_cai_) opencv学习笔记(1):图像形态学计算的方式 morphology函数的应用

    1.腐蚀 概述:腐蚀掉图像的细节.若图像有很多毛刺,通过腐蚀操作,可以将毛刺消除. 下面所说的"值"可以简单理解为RGB三个通道[0,255],值越小,亮度越低,值越大,亮度越高. ...

最新文章

  1. DWZ 在js中刷新某个navTab
  2. struts 权限控制
  3. 微信 android兼容性问题怎么解决方案,微信小程序兼容性问题
  4. java 数据库查询Date类型字段 没有了时分秒 全为 00 的解决办法
  5. php获取微信小程序用户头像,微信小程序获取用户头像+昵称+openid,小程序登录!附前端后端源码!...
  6. 吴恩达机器学习(十三)异常检测(高斯分布)
  7. CRACK秘籍之爆破
  8. 基于51单片机开发板8*8LED矩阵的贪吃蛇程序
  9. PWM占空比和分辨率
  10. 计算机考研,这样选学校才是正解
  11. 高速学习的奥秘:大脑的不同学习机制
  12. 只要你足够好——写给理想受挫的人们
  13. php获取手机号码6,php随机生成姓名,手机号,6位数
  14. haproxy+rabbitmq镜像集群
  15. Spring系列学习之Spring Data Elasticsearch数据访问
  16. ch01: 初识数据库
  17. Tcl/Tk入门(中)
  18. 浅谈互联网行业发展趋势及现状
  19. 树莓派64位系统bullseye如何成功安装Qt5
  20. bzoj5020[THUWC 2017]在美妙的数学王国中畅游(LCT)

热门文章

  1. 测开 - 自动化测试selenium(WebDriver API) - 细节狂魔
  2. Mixly制作的MP3播放和七彩灯、台灯控制例子
  3. 虚拟现实内容开发收费标准
  4. teamviewer检测到商业用途的解决办法(win7 win8 win10亲测) 修改teamviewerID
  5. [附源码]计算机毕业设计Python架构的博客平台设计(程序+源码+LW文档)
  6. 利用python爬取贝壳网租房信息
  7. 什么是 P、PE、CE ?
  8. python 数据库框架peewee_python peewee模块使用
  9. QT-Linux安装
  10. iOS时间戳与北京时间的转换