OpenCV图像处理技术(Python)——图像金字塔

本文介绍了OpenCV中的图像金字塔技术,包括高斯金字塔的构建、拉普拉斯金字塔及其应用,如图像的上下采样、ROI理解和泛洪填充。主要使用了cv2.pyrDown()和cv2.pyrUp()函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

© Fu Xianjun. All Rights Reserved.

一、理论基础

图像金字塔是同一图像不同分辨率的子图集合,是通过对原图像不断地向下采样而产生的,即由高分变率的图像(大尺寸)产生低分辨率的近似图像(小尺寸)。
· 邻域滤波器: 采用邻域平均技术求原始图像的近似图像。该滤波器能够产生平均金字塔。
· 高斯滤波器: 采用高斯滤波器对原始图像进行滤波,得到高斯金字塔。这是OpenCV函数cv2.pyrDown()所采用的方式。

二、图像金字塔

1.高斯金字塔构建

1.1pyrDown函数及使用
·作用 :用于实现图像函数高斯金字塔操作中的向下采样。
·语法格式
dst=cv2.pyrDown(scr[,dstsize[,borderType]])

1.2pyrUp函数及使用
·作用: 用于实现图像函数高斯金字塔操作中的向上采样。
·语法格式
dst=cv2.pyrUp(scr[,dstsize[,borderType]])
代码如下:

import cv2 
import numpy as np
#高斯金字塔
def pyramid_demo(image,level):
    temp = image.copy()
    pyramid_images = []
    for i in range(level):
        dst = cv2.pyrDown(temp)
        pyramid_images.append(dst)
        cv2.imshow("pyramid_down_"+str(i), dst)
        temp = dst.copy()
    return pyramid_images[level-1]
src = cv2.imread("lena.jpg")
cv2.imshow("input image", src)
pyramid_demo(src,4)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果如下:
在这里插入图片描述

2.拉普拉斯金字塔构建

2.1拉普拉斯金字

代码如下:

# 拉普拉斯金字塔构建
G0 = cv2.imread("lena.bmp")
cv2.imshow("input image",G0)
G1=cv2.pyrDown(G0)
G2=cv2.pyrDown(G1)
G3=cv2.pyrDown(G2)
G4=cv2.pyrDown(G3)
L0 = cv2.subtract(G0,cv2.pyrUp(G1))
L1 = cv2.subtract(G1,cv2.pyrUp(G2))
L2 = cv2.subtract
### Python 图像处理 示例代码 #### 使用 Pillow 库读取并显示图像 Pillow 是一个功能丰富的图像处理库,能够提供多种图像操作方法。下面是一个简单的例子来展示如何使用 Pillow 来加载一张图片,并获取其基本信息。 ```python from PIL import Image img_pil = Image.open('example.jpg') print(f'Image size: {img_pil.size}') # 输出图像大小 (宽度, 高度) print(f'Mode of image: {img_pil.mode}') # 获取颜色模式 img_pil.show() # 显示图像 ``` 这段代码展示了怎样通过 `open` 函数打开一幅名为 'example.jpg' 的图像文件,并调用了几个属性和方法来查看该图的信息以及将其可视化[^1]。 #### 利用 OpenCV 进行金字塔融合创建混合图像 对于更复杂的任务比如图像合成,可以采用基于多尺度表示的方法之一——高斯/拉普拉斯金字塔变换。这里给出一段利用 OpenCV 实现两个不同源图像之间平滑过渡效果的例子: ```python import cv2 import numpy as np def blend_images(imageA_path, imageB_path): A = cv2.imread(imageA_path) B = cv2.imread(imageB_path) # Generate Gaussian pyramid for both images... G = A.copy() gpA = [G] for i in range(6): G = cv2.pyrDown(G) gpA.append(G) G = B.copy() gpB = [G] for i in range(6): G = cv2.pyrDown(G) gpB.append(G) # ...and then Laplacian Pyramid 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) 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) LS = [] for la,lb in zip(lpA,lpB): rows,cols,dpt = la.shape ls = np.hstack((la[:,0:int(cols/2)], lb[:,int(cols/2):])) LS.append(ls) ls_ = LS[0] for i in range(1,6): ls_ = cv2.pyrUp(ls_) ls_ = cv2.add(ls_, LS[i]) real = np.hstack((A[:,:int(A.shape[1]/2)],B[:,int(B.shape[1]/2):])) cv2.imwrite('pyramid_blending.png',ls_) blend_images('apple.jpg','orange.jpg') ``` 此脚本实现了经典的 "Orapple" 效果,即将苹果与橙子两张照片沿中间线无缝拼接在一起形成新的水果形象[^2]。 #### 借助 scikit-image 展示图像数据结构 Scikit-image 提供了一套简洁易懂的应用程序接口用于科学计算领域内的图像分析工作。下述片段说明了如何借助这个包导入外部图形资源并打印出对应的数组形状。 ```python from skimage import io img_skimage = io.imread('test.jpg') print(img_skimage.shape) # 形状为 (高度, 宽度, 通道数), 对于彩色 RGB 图片通常会返回三个维度的数据 io.imshow(img_skimage) ``` 上述命令不仅完成了对指定路径下的 JPEG 文件的解析过程,还运用 Matplotlib 工具箱中的绘图函数呈现最终结果给用户观察[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值