【OpenCV-Python】教程:3-8 图像金字塔
OpenCV Python 图像金字塔
【目标】
- 学习图像金字塔
- cv2.pyrUp(), cv2.pyrDown()
【原理】
在某些情况下,需要处理不同分辨率的图像。我们需要创建不同分辨率的图像,最高分辨率的在最下面,最低分辨率的在最上面,看起来像金字塔。
高斯金字塔中的最高级别(低分辨率)是通过移除低级别(高分辨率)图像中的连续行和列而形成的。较高级别的每个像素由高斯权重的基础级别中的5个像素贡献而成。 M ∗ N M*N M∗N 的图像变成了 ( M / 2 ) ∗ ( N / 2 ) (M/2)*(N/2) (M/2)∗(N/2) 。
【代码】
- pyrDown
import cv2
img = cv2.imread('messi5.jpg', 1)
lower1 = cv2.pyrDown(img)
lower2 = cv2.pyrDown(lower1)
lower3 = cv2.pyrDown(lower2)
lower4 = cv2.pyrDown(lower3)
cv2.imshow('src', img)
cv2.imshow('down1', lower1)
cv2.imshow('down2', lower2)
cv2.imshow('down3', lower3)
cv2.imshow('down4', lower4)
cv2.waitKey(0)
cv2.destroyAllWindows()
- pyrUp
import cv2
img = cv2.imread('lena-small.jpg', 1)
big1 = cv2.pyrUp(img)
big2 = cv2.pyrUp(big1)
cv2.imshow('src', img)
cv2.imshow('up1', big1)
cv2.imshow('up2', big2)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 图像混合
import cv2
import numpy as np,sys
A = cv2.imread('apple.jpg')
B = cv2.imread('orange.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)
# 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)
# Now add left and right halves of images in each level
LS = []
for la,lb in zip(lpA,lpB):
rows,cols,dpt = la.shape
ls = np.hstack((la[:,0:cols//2], lb[:,cols//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.hstack((A[:,:cols//2],B[:,cols//2:]))
# cv2.imwrite('Pyramid_blending2.jpg',ls_)
# cv2.imwrite('Direct_blending.jpg',real)
cv2.imshow("apple", A)
cv2.imshow("orange", B)
cv2.imshow("Pyramid_blending", ls_)
cv2.imshow("Direct_blending", real)
cv2.waitKey(0)
cv2.destroyAllWindows()
【接口】
- pyrDown
void cv::pyrDown ( InputArray src,
OutputArray dst,
const Size & dstsize = Size(),
int borderType = BORDER_DEFAULT
);
cv2.pyrDown( src[, dst[, dstsize[, borderType]]] ) -> dst
图像模糊后下采样。
默认情况下,输出图像的尺寸是通过输入图像来计算的。但是任何情况下,得满足 ∣ d s t . w i d t h ∗ 2 − s r c . w i d t h ∣ ≤ 2 |dst.width*2-src.width|≤2 ∣dst.width∗2−src.width∣≤2, ∣ d s t . h e i g h t ∗ 2 − s r c . h e i g h t ∣ ≤ 2 |dst.height*2-src.height|≤2 ∣dst.height∗2−src.height∣≤2
在下采样前需要先进行高斯模糊,
1 256 [ 1 4 6 4 1 4 16 24 16 4 6 24 36 24 6 4 16 24 16 4 1 4 6 4 1 ] \frac{1}{256}\begin{bmatrix} 1 & 4 & 6 & 4 & 1 \\ 4 & 16 & 24 & 16 & 4 \\ 6 & 24 & 36 & 24 & 6 \\ 4 & 16 & 24 & 16 & 4 \\ 1 & 4 & 6 & 4 & 1 \end{bmatrix} 2561 1464141624164624362464162416414641
- src: 输入图像
- dst: 输出图像
- dstsize: 输出图像的尺寸
- borderType: 扩边类型,不支持
BORDER_CONSTANT
- pyrUp
void cv::pyrUp ( InputArray src,
OutputArray dst,
const Size & dstsize = Size(),
int borderType = BORDER_DEFAULT
);
cv2.pyrUp( src[, dst[, dstsize[, borderType]]] ) -> dst
图像上采样后高斯模糊
- src: 输入图像
- dst: 输出图像
- dstsize: 输出图像的尺寸
- borderType: 扩边类型,不支持
BORDER_CONSTANT
【参考】
相关文章
- Python 图_系列之基于邻接炬阵实现广度、深度优先路径搜索算法
- mt4 python_一个使用Python自动化交易外汇MT4脚本实现「建议收藏」
- 苹果电脑python官网下载步骤-Python下载和安装图文教程[超详细]
- OpenCV-Python教程(8、Canny边缘检测)
- python删除首行_Python删除文件第一行
- python大数据分析实例-用Python整合的大数据分析实例
- python黑帽子三通过paramiko使用ssh
- 迭代器Python_python进阶路线
- python闭包详解_python闭包的使用场景
- python题库刷题训练选择题_python值得学吗
- 【说站】python常量是什么
- pycharm安装opencv-python_pycharm下载库
- Python-OpenCV,基于标准文档的实例(一)
- python修改第三方库重写_对Python第三方库,再次封装
- Python文件名后缀_python获取目录下所有文件的文件名
- python深度学习库系列教程——python调用opencv库教程
- Python创意游戏《勇闯BUBU星》
- 1行Python代码,把PPT转成图片,python-office功能更新~
- python上下文管理器
- Python进阶
- 搭建python开发环境-c++教程 如何搭建Python开发环境?
- 【测试开发】python系列教程:Python 推导式
- 【测试开发】python系列教程:Python 运算符
- 使用Python+Opencv从摄像头逐帧读取图片保存在本地
- Python之xpath、JsonPath、bs4基本使用
- 在Linux上学习Python——你的编程之路(linux学python)
- Python程序设计入门(4)模块和包