Opencv笔记(十五)——图像金字塔
目标
- 学习图像金字塔
- 学习函数cv2.pyrUp()和cv2.pyrDown()
原理
当我们需要将图像转换到另一个尺寸的时候, 有两种可能,一种是放大图像,另一种是缩小图像。尽管在Opencv几何变换中学到了resize()函数,不过使用图像金字塔来做图像缩放也是视觉运用中广泛应用的一项技术。
一般来说我们操作的图像是具有固定分辨率的,但是有些情况下,我们需要对同一图像的不同分辨率的子图像进行处理(尤其是在我们需要提取图像特征的时候)。这个时候我们需要创建一组新的图像,这些图像是具有不同分辨率的原始图像,那么我们把这组图像讲成图像金字塔。我们把最大的图像放在底部,最小的放在底部,看起来就像金字塔。如下所示:
图像金字塔
图像金字塔主要涉及两个函数:cv2.pyrUp()(图像尺寸变大,但分辨率不会增加),cv2.pyrDown()(图像尺寸变小,分辨率减少)
图像金字塔有两类类型:高斯金字塔和拉普拉斯金字塔。
高斯金字塔的顶部是通过将底部图像的连续行与列去掉得到的。每一层图像中的像素值等于下一层图像中对应位置5个像素的高斯加权平均值。这样操作一个M*N的图像就变成了(M/2)*(N/2)的图像,图像的面积就变为原来的1/4,连续进行这样的操作,就会得到一些列的金字塔的图像。如果是将图像变大,首先需要将图像在每个方向扩大为原来的两倍,新增的行和列以0填充,随后使用先前同样的内核(乘以4)与放大后的图像卷积,获得 “新增像素” 的近似值。Opencv中可以通过函数cv2.pyrDown()和cv2.pyrUp()来构建金字塔。
函数说明
函数cv2.pyrDown()可以将一个高分辨率图像变成低分辨率图像,其接受3个参数:
- 要处理的图像src
- 输出图像dst
- 输出图像大小
默认情况下,只需要一个src参数即可,他会把图像按缩小1/4的来处理。cv2.pyrUp()函数的参数也是如此。下面是函数cv2.pyrDown()的使用。
# coding=utf-8
import cv2
img = cv2.imread("/home/wl/3.jpg", 1)
dst = cv2.pyrDown(img)
while(1):
cv2.imshow("Result",dst)
cv2.imwrite("/home/wl/baocun.jpg",dst)
k = cv2.waitKey(1) & 0XFF
if k==ord('q'):
break;
cv2.destroyAllWindows()
原始图:
效果图:
cv2.pyrUp()函数与cv2.pyrDown()函数的功能相反,把金字塔上层的图像变到下一层来,也就是图像变大,但是有一点要注意的是,虽然变大了,但是图像并不能恢复成以前的样子,也就是分辨率上不能达到以前的那种效果。
将上面代码第六行修改为:
dst = cv2.pyrUp(res)
效果图:
图像的拉普拉斯金字塔可以由图像的高斯金字塔得到,转换的公式为:
拉普拉斯金字塔的图像看起来就像是边界图,其中很多像素都是0,经常被用在图像压缩中。
# coding=utf-8
import cv2
img = cv2.imread("/home/wl/3.jpg", 0)
img1 = cv2.pyrDown(img) #高斯金字塔
temp_img1 = cv2.pyrUp(img1)
img2 = cv2.pyrDown(temp_img1)
dst = img1 - img2 #拉普拉斯金字塔
cv2.imwrite("/home/wl/baocun.jpg",dst)
while(1):
cv2.imshow("Result1",img1)
cv2.imshow("Result2",dst)
cv2.imwrite("/home/wl/baocun.jpg",img1)
cv2.imwrite("/home/wl/baocun1.jpg", dst)
k = cv2.waitKey(1) & 0XFF
if k==ord('q'):
break;
cv2.destroyAllWindows()
效果图:
Opencv笔记(十五)——图像金字塔的更多相关文章
- opencv笔记2:图像ROI
time:2015年 10月 03日 星期六 12:03:45 CST # opencv笔记2:图像ROI ROI ROI意思是Region Of Interests,感兴趣区域,是一个图中的一个子区 ...
- python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...
- (C/C++学习笔记) 十五. 构造数据类型
十五. 构造数据类型 ● 构造数据类型概念 Structured data types 构造数据类型 结构体(structure), 联合体/共用体 (union), 枚举类型(enumeration ...
- OpenCV学习笔记十五:opencv_features2d模块
一,简介: 该库用于2D特征检测,描述与匹配.
- 论文阅读笔记十五:Pyramid Scene Parsing Network(CVPR2016)
论文源址:https://arxiv.org/pdf/1612.01105.pdf tensorflow代码:https://github.com/hellochick/PSPNet-tensorfl ...
- (转载)西门子PLC学习笔记十五-(数据块及数据访问方式)
一.数据块 数据块是在S7 CPU的存储器中定义的,用户可以定义多了数据块,但是CPU对数据块数量及数据总量是有限制的. 数据块与临时数据不同,当逻辑块执行结束或数据块关闭,数据块中的数据是会保留住的 ...
- Opencv笔记(十八)——轮廓的更多函数及其层次结构
凸缺陷 前面我们已经学习了轮廓的凸包,对象上的任何凹陷都被成为凸缺陷.OpenCV 中有一个函数 cv.convexityDefect() 可以帮助我们找到凸缺陷.函数调用如下: hull = cv2 ...
- MySQL学习笔记十五:优化(2)
一.数据库性能评测关键指标 1.IOPS:每秒处理的IO请求次数,这跟磁盘硬件相关,DBA不能左右,但推荐使用SSD. 2.QPS:每秒查询次数,可以使用show status或mysqladmin ...
- 【慕课网实战】Spark Streaming实时流处理项目实战笔记十五之铭文升级版
铭文一级:[木有笔记] 铭文二级: 第12章 Spark Streaming项目实战 行为日志分析: 1.访问量的统计 2.网站黏性 3.推荐 Python实时产生数据 访问URL->IP信息- ...
- angular学习笔记(十五)-module里的'服务'
本篇介绍angular中的模块:module 在笔记(二)http://www.cnblogs.com/liulangmao/p/3711047.html里已经讲到过模块,这篇主要讲模块的 '服务' ...
随机推荐
- idea新建java项目
盘符下新建一个目录: 打开idea: Open -> 新建的目录: 右击目录 -> new -> module: 填写模块名 -> finish: file -> pro ...
- 吴裕雄--天生自然 PHP开发学习:echo 和 print 语句
<?php echo "<h2>PHP 很有趣!</h2>"; echo "Hello world!<br>"; ec ...
- UNION和UNION ALL的作用和语法
主要就是两句话区别: union是联合的意思,就是合并两个或多个select语句的结果集,并消除重复行: union all 当然也是联合的意思,也是合并两个或多个select语句的结果集,但是保留重 ...
- 每天一点点之vue框架开发 - 数据渲染-for循环中动态设置页面背景色
实现方式很简单,在属性前加:,表示绑定 :style="{'background':item.bgColor} 代码样例: <li v-for="item in laber_ ...
- 瑞士军刀DLib的VS2015编译
Dlib的官方解释是: Dlib is a modern C++ toolkit containing machine learning algorithms and tools for creati ...
- DRF框架之序列化器初体验
首先,我们需要明白序列化和反序列化的过程指的是什么. 序列化操作:将模型数据 ---> 字典数据 --->JSON数据(响应JSON数据的操作) 反序列化操作:将JSON数据 ---> ...
- delphi 文本 记录 流式 读写文件
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...
- hook鼠标键盘记录和回放
unit Unit1; // download by http://www.codefans.net interface uses Windows, Messages, SysUtils, Class ...
- List、Set和Map详解及其区别和他们分别适用的场景
Java中的集合包括三大类 它们是Set(集).List(列表)和Map(映射),它们都处于java.util包中,Set.List和Map都是接口,它们有各自的实现类.Set的实现类主要有HashS ...
- macOS下的播放器
很早前用 MplayerX, 现在不能用了, 找到一个替代品 https://iina.io/. 挺不错.