opencv学习(十七):图像金子塔

博客介绍了图像金子塔的概念,包括高斯金字塔和拉普拉斯金字塔,并详细阐述了OpenCV中`pyrUp`和`pyrDown`函数在图像尺寸调整中的应用。图像金字塔主要用于图像分割和多尺度表达,而`pyrUp`和`pyrDown`虽然能改变图像尺寸,但不是互逆操作。文章还提供了实例演示代码。
摘要由CSDN通过智能技术生成

边缘检测算子

参考学习链接:https://blog.csdn.net/xiaowei_cqu/article/details/7829481

图像金子塔

参考学习链接:https://www.cnblogs.com/Matrix420/p/4214123.html

opencv中的高斯金字塔、拉普拉斯金字塔与图片尺寸缩放常用函数说明,

可以使用OpenCV为我们提供的如下两种方式:

<1>resize函数。这是最直接的方式,

<2>pyrUp( )、pyrDown( )函数。即图像金字塔相关的两个函数,对图像进行向上采样,向下采样的操作。

pyrUp、pyrDown其实和专门用作放大缩小图像尺寸的resize在功能上差不多,披着图像金字塔的皮,说白了还是在对图像进行放大和缩小操作。另外需要指出的是,pyrUp、pyrDown在OpenCV的imgproc模块中的Image Filtering子模块里。而resize在imgproc 模块的Geometric Image Transformations子模块里。

图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构。

图像金字塔最初用于机器视觉和图像压缩,一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。

金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似。

我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。

一般情况下有两种类型的图像金字塔常常出现在文献和以及实际运用中。他们分别是:

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

两者的简要区别:高斯金字塔用来向下降采样图像,而拉普拉斯金字塔则用来从金字塔底层图像中向上采样重建一个图像。

要从金字塔第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( )是一个会丢失信息的函数。为了恢复原来更高的分辨率的图像,我们要获得由降采样操作丢失的信息,这些数据就和拉普拉斯金字塔有关系了。

实例演示:

代码如下:

# 导入cv模块
import cv2 as cv
import numpy as np


# 高斯金子塔
def pyrmid_demo(image):
    level = 3
    temp = image.copy()
    pyrmid_images = []
    for i in range(level):
        dst = cv.pyrDown(temp)
        pyrmid_images.append(dst)
        cv.imshow("pyrmid_down_" + str(i), dst)
        temp = dst.copy()
    return pyrmid_images


# 拉普拉斯金字塔
def lapalim_demo(image):
    pyrmid_images = pyrmid_demo(image)
    level = len(pyrmid_images)
    for i in range[level - 1, -1, -1]:
        if (i - 1) < 0:
            expand = cv.pyrUp(pyrmid_images[i], dstsize=image.shape[:2])
            lpls = cv.subtract(image, expand)
            cv.imshow("lapalim_down_" + str(i), lpls)
        else:
            expand = cv.pyrUp(pyrmid_images[i], dstsize=pyrmid_images[i - 1].shape[:2])
            lpls = cv.subtract(pyrmid_images[i - 1], expand)
            cv.imshow("lapalim_down_" + str(i), lpls)


print("------------Hi,Python!-------------")
# 读取图像,支持 bmp、jpg、png、tiff 等常用格式
src = cv.imread("F:/Projects/images/demo.png")
# 创建窗口并显示图像
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)  # 显示原图
pyrmid_demo(src)
cv.waitKey(0)
# 释放窗口
cv.destroyAllWindows()

运行效果:

 

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值