美文网首页游戏王的故事
openCV:图像金字塔

openCV:图像金字塔

作者: SwiftBirds | 来源:发表于2019-09-25 08:01 被阅读0次

    定义

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

    进行图像缩放可以用图像金字塔,也可以使用resize函数进行缩放,后者效果更好。这里只是对图像金字塔做一些简单了解。

    图像金字塔.png

    高斯金字塔

    • 用于下采样,高斯金字塔是最基本的图像塔。
    • 原理:首先将原图像作为最底层图像G0(高斯金字塔的第0层),利用高斯核(5*5)对其进行卷积,然后对卷积后的图像进行下采样(去除偶数行和列)得到上一层图像G1,
    • 将此图像作为输入,重复卷积和下采样操作得到更上一层图像,反复迭代多次,形成一个金字塔形的图像数据结构,即高斯金字塔。

    采样类型

    上采样

    • 就是图片放大(所谓上嘛,就是变大),使用PryUp函数。
    • 步骤:先将图像在每个方向放大为原来的两倍,新增的行和列用0填充,再使用先前同样的内核与放大后的图像卷积,获得新增像素的近似值。
    上采样

    下采样

    • 就是图片缩小(所谓下嘛,就是变小),使用PryDown函数。
    • 步骤:先对图像进行高斯内核卷积 ,再将所有偶数行和列去除。
    下采样
    import cv2 #opencv读取的格式是BGR
    import numpy as np
    import matplotlib.pyplot as plt#Matplotlib是RGB
    %matplotlib inline 
    
    def cv_showimg(name,img):
        cv2.imshow(name, img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    
    # 原图
    img=cv2.imread("lena.jpg")
    cv_showimg('img',img)
    print (img.shape)
    
    (263, 263, 3)
    
    原图.PNG
    # 高斯金字塔-向上
    up=cv2.pyrUp(img)
    cv_showimg('up',up)
    print (up.shape)
    
    (526, 526, 3)
    
    高斯金字塔-向上.PNG
    # 高斯金字塔-向下
    down=cv2.pyrDown(img)
    cv_showimg('down',down)
    print (down.shape)
    
    (132, 132, 3)
    
    高斯金字塔-向下.PNG
    # 向上-向下法
    up=cv2.pyrUp(img)
    up_down=cv2.pyrDown(up)
    cv_showimg('img vs up_down',np.hstack((img,up_down)))
    cv_showimg('img-up_down',img-up_down)
    
    原图与向上向下法的对比.PNG

    总之,上、下采样都存在一个严重的问题,那就是图像变模糊了,因为缩放的过程中发生了信息丢失的问题。要解决这个问题,就得用拉普拉斯金字塔。

    拉普拉斯金字塔

    • 用于重建图像,也就是预测残差,对图像进行最大程度的还原。比如一幅小图像重建为一幅大图,
    • 原理:用高斯金字塔的每一层图像减去其上一层图像上采样并高斯卷积之后的预测图像,得到一系列的差值图像即为 LP 分解图像。
    拉普拉斯金字塔.png
    # 拉普拉斯金字塔LP1
    img=cv2.imread("AM.png")
    down=cv2.pyrDown(img)
    down_up=cv2.pyrUp(down)
    l_1=img-down_up
    cv_showimg('l_1',np.hstack((img,img-down_up)))
    
    拉普拉斯金字塔LP1.PNG

    相关文章

      网友评论

        本文标题:openCV:图像金字塔

        本文链接:https://www.haomeiwen.com/subject/qdnmuctx.html