opencv学习笔记(三)—— 利用图像金字塔进行图像无缝拼接,cv2.pyrDown() ,cv2.pyrUp()
原理
一般情况下,我们要处理是一副具有固定分辨率的图像。但是有些情况下,我们需要对同一图像的不同分辨率的子图像进行处理。比如,我们要在一幅图像中查找某个目标,比如脸,我们不知道目标在图像中的尺寸大小。这种情况下,我们需要创建创建一组图像,这些图像是具有不同分辨率的原始图像。我们把这组图像叫做图像金字塔(简单来说就是同一图像的不同分辨率的子图集 合)。如果我们把最大的图像放在底部,最小的放在顶部,看起来像一座金字塔,故而得名图像金字塔。
有两类图像金字塔:高斯金字塔和拉普拉斯金字塔。
高斯金字塔的顶部是通过将底部图像中的连续的行和列去除得到的。顶部图像中的每个像素值等于下一层图像中 5 个像素的高斯加权平均值。这样 操作一次一个 MxN 的图像就变成了一个 M/2 x N/2 的图像。所以这幅图像的面积就变为原来图像面积的四分之一。这被称为 Octave。连续进行这样的操作我们就会得到一个分辨率不断下降的图像金字塔。我们可以使用函数 cv2.pyrDown() 和 cv2.pyrUp() 构建图像金字塔。
函数 cv2.pyrDown() 从一个高分辨率大尺寸的图像向上构建一个金子塔(尺寸变小,分辨率降低)。
img = cv2.imread('cat1.jpg')
lower_reso = cv2.pyrDown(img)cv2.imshow("img", img)
cv2.imshow("img1", lower_reso)
cv2.waitKey(0)
cv2.destroyAllWindows()
函数cv2.pyrUp()从一个低分辨率小尺寸的图像向下构建一个金子塔(尺寸变大,但分辨率不会增加)。
higher_reso = cv2.pyrUp(lower_reso)cv2.imshow("img", img)
cv2.imshow("img1", lower_reso)
cv2.imshow("img2", higher_reso)
cv2.waitKey(0)
cv2.destroyAllWindows()
higher_reso 和 img 是不同的。因为一旦使用 cv2.pyrDown(),图像的分辨率就会降低,信息就会被丢失。下图就是从 cv2.pyrDown() 产生的图像金字塔的(由下到上)第二层图像使用函数 cv2.pyrUp() 得到的图像,与原图像相比清晰度差了很多。
拉普拉斯金字塔可以有高斯金字塔计算得来,公式如下:
拉普拉金字塔的图像看起来就像边界图,其中很多像素都是 0。他经常被用在图像压缩中。下图就是一个三层的拉普拉斯金字塔:
使用金字塔进行图像融合
图像金字塔的一个应用是图像融合。例如,在图像缝合中,你需要将两幅图叠在一起,但是由于连接区域图像像素的不连续性,整幅图的效果看起来会很差。这时图像金字塔就可以排上用场了,他可以帮你实现无缝连接。这里的一个经典案例就是将两个水果融合成一个。
A = cv2.imread('orange.jpg')
B = cv2.imread('apple.jpg')
# generate Gaussian pyramid for A
G = A.copy()
gpA = [G]
for i in range(6): G = cv2.pyrDown(G) gpA.append(G)
# generate Gaussian pyramid for B
G = B.copy()
gpB = [G]
for i in range(6): G = cv2.pyrDown(G) gpB.append(G)
# generate Laplacian Pyramid for A
lpA = [gpA[5]]
for i in range(5,0,-1): GE = cv2.pyrUp(gpA[i]) L = cv2.subtract(gpA[i-1],GE) lpA.append(L)
u = gpA[i-1]
v = GE
# generate Laplacian Pyramid for B
lpB = [gpB[5]]
for i in range(5,0,-1): GE = cv2.pyrUp(gpB[i]) L = cv2.subtract(gpB[i-1],GE) lpB.append(L)
# 把金字塔的每一层图像都上下拼接
#Take a sequence of arrays and stack them horizontally
#to make a single array.
LS = []
for la,lb in zip(lpA,lpB): rows,cols,dpt = la.shape ls = np.vstack((la[0:round(rows/2),:], lb[round(rows/2):,:])) LS.append(ls)
# now reconstruct
ls_ = LS[0]
for i in range(1,6): ls_ = cv2.pyrUp(ls_) ls_ = cv2.add(ls_, LS[i])
# image with direct connecting each half
real = np.vstack((A[:round(rows/2),:],B[round(rows/2):,:]))cv2.imwrite('Pyramid_blending2.jpg',ls_)
cv2.imwrite('Direct_blending.jpg',real)
结果如下,左图是直接拼接,右图是用金字塔拼接,由于大小没有调整好所以还是有些许不和谐
opencv学习笔记(三)—— 利用图像金字塔进行图像无缝拼接,cv2.pyrDown() ,cv2.pyrUp()相关推荐
- 【OpenCV 学习笔记】—— 基于拉普拉斯金字塔的图像融合原理以及C++实现【或许是全网最通俗易懂的讲解】
文章目录 一.高斯金字塔 1.1 什么是高斯金字塔 1.2 利用OpenCV求取高斯金字塔 二.拉普拉斯金字塔 2.1 什么是拉普拉斯金字塔 2.2 利用 OpenCV求取拉普拉斯金字塔 三.基于拉普 ...
- OpenCV学习笔记(十五):图像仿射变换:warpAffine(),getRotationMatrix2D()
OpenCV学习笔记(十五):图像仿射变换:warpAffine(),getRotationMatrix2D() 一个任意的仿射变换都能表示为乘以一个矩阵(线性变换)接着再加上一个向量(平移)的形式. ...
- Opencv学习笔记(三) -- 图像压缩与保存
1.图像压缩 1.1常用图像格式 bmp Windows位图格式.该格式为不压缩格式,缺点是图像文件较大. jpg JPEG是为静态图像所建立的第一个国际数字图像压缩标准,也是至今一直在使用的.应用最 ...
- brisk matlab,opencv学习笔记三十七:BRISK特征点检测与匹配
简介 BRISK算法是2011年ICCV上<BRISK:Binary Robust Invariant Scalable Keypoints>文章中,提出来的一种特征提取算法,也是一种二进 ...
- Python OpenCV学习笔记之:分水岭算法分割图像
为什么80%的码农都做不了架构师?>>> # -*- coding: utf-8 -*- """ 图像分水岭分割图像 分水岭算法可以参考:http ...
- OpenCV学习笔记(七):访问图像中像素的三类方法
该文章参考毛星云著<OpenCV3编程入门>,电子工业出版社. 图像是以像素为单位储存的,访问图像中的每个像素是处理图像的基础,一般有三种访问图像像素的方法: 方法一:指针访问:C操作符[ ...
- OpenCV学习笔记三-Mat数据结构
主要记录Mat数据结构的一些操作 P3 Mat 数据结构的一些操作 #include<opencv2/opencv.hpp> #include<iostream>using n ...
- opencv学习笔记三十六:AKAZE特征点检测与匹配
KAZE是日语音译过来的 , KAZE与SIFT.SURF最大的区别在于构造尺度空间,KAZE是利用非线性方式构造,得到的关键点也就更准确(尺度不变性 ): Hessian矩阵特征点检测 ,方向指定, ...
- Opencv开发笔记(三):使用形态学滤波对图像进行边缘及角点检测
形态学滤波可以用于检测图像中指定的特征点,接下来这篇文章我们运用Opencv中的形态学函数来检测灰度图中的直角和角点. 首先我们为了方便使用先封装一个名称为MorphoFeatures的类,然后就可以 ...
- 某人写的openCV学习笔记
原文地址:某人写的openCV学习笔记作者:拔剑 http://blog.csdn.net/thefutureisour 我的OpenCV学习笔记(25):c++版本的高斯混合模型的源代码完全注释 之 ...
最新文章
- python的模块和类_Python模块和类.md
- 前端ui框架_跨屏建站发布同名响应式前端ui框架
- Python爬虫开发:requests库的使用--https协议的问题解决
- 程序员,如何摆脱平庸?
- Spring-第2天
- cocos2d-x画线
- UC伯克利超酷研究:舞痴和舞王之间,只差一个神经网络
- H5编辑器核心算法和思想-遁地龙卷风
- C3P0连接池的基本配置与使用
- sklearn做文本聚类分析
- 宁盾堡垒机双因素认证方案
- 解决Proteus仿真时候提示Could not load simulator DLL错误
- android 虚拟键 高度,Android获取虚拟按键的高度(适配全面屏)
- 微信小程序2D canvas绘制分享海报
- QQ群文件下载速度慢-解决办法
- css 小于10像素字体
- 【腾讯Bugly干货分享】打造“微信小程序”组件化开发框架
- HI3516D之Caffe移植
- Studio 3T 破解
- 开放系统理论(3)生物的特征——热力学第二定律,和熵(2)宇宙是倾向于无序的吗?