图像金字塔

目录

  • 图像金字塔介绍
  • 图像金字塔的分类
    (1)高斯金字塔
    (2)拉普拉斯金字塔
  • OpenCV方法介绍及代码实现
    (1)pyrDown 下采样
    (2)pyrUp 下采样
图像金字塔介绍

图像金字塔是图像中多尺度表达的一种,最主要用于图像分割,也就是用来图像缩放的。
进行图像缩放可以用图像金字塔,也可以用cv.resize函数进行缩放,后果效果更好,且更加灵活

图像金字塔分类
  • 高斯金字塔(Gaussianpyramid):用来下采样,最基本的金字塔
    在这里插入图片描述
    上图,将leve0为原图G0,按照level等级依次为G1,G2,G3,G4
    图像下采样
    为了获取层级为 G1 的金字塔图像,我们采用如下方法:
    <1> 对原图像进行高斯内核卷积
    <2> 将所有偶数行和列去除
    得到上一层图像G1,结果图像只有原图的四分之一。通过对输入图像不停迭代以上步骤就会得到整个金字塔。同时我们也可以看到,向下取样会逐渐丢失图像的信息。
    以上就是对图像的向下取样操作,即缩小图像。。

    图像上采样

  • 拉普拉斯金字塔(Laplacianpyramid):用于重建图像,配合高斯金字塔一起使用,也就是预测残差,对图像进行最大程度的还原。比如一幅小图像重建为一幅大图
    在这里插入图片描述
    如果想放大图像,具体做法如下:
    <1>将图像G4在每个方向扩大为原来的两倍,新增的行和列以0填充
    <2>使用先前同样的内核(乘以4)与放大后的图像卷积,获得 “新增像素”的近似值
    <3>再用G3减去第二步得到的图像pyrUP(G4)即的到放大的图像

得到的图像即为放大后的图像,但是与原来的图像相比会发觉比较模糊,因为在缩放的过程中已经丢失了一些信息,如果想在缩小和放大整个过程中减少信息的丢失,这些数据形成了拉普拉斯金字塔。
OpenCV方法介绍及代码实现

OpenCV方法介绍及代码实现

高斯金字塔实现下采样pyrDown

import cv2 as cv
import numpy as np

def pyramid_demo(image):
    level = 3
    temp = image.copy()
    for i in range(level):
        pyrdowm_imgs = []
        dst = cv.pyrDown(temp) #对图像进行下采样,图像变成原来的四分之一
        pyrdowm_imgs.append(dst) # 将每次缩小的图片储存到列表内
        temp = dst.copy()
        cv.imshow("level"+str(i+1), dst)  #展示图片
    return pyrdowm_imgs

print("----------------hello python opencv---------------------")
src = cv.imread("D:/pyhton/PhotoIditifyStuday/photo/girl.jpg") #读取原图片
cv.namedWindow("input_image", cv.WINDOW_AUTOSIZE)
cv.imshow("input_image", src)
pyramid_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

使用拉普拉斯金字塔实现上采样 pyrUp

import cv2 as cv
import numpy as np

def pyramid_demo(image):
    level = 3
    temp = image.copy()
    pyrdowm_imgs = []
    for i in range(level):
        dst = cv.pyrDown(temp) #对图像进行下采样,图像变成原来的四分之一
        pyrdowm_imgs.append(dst) # 将每次缩小的图片储存到列表内
        temp = dst.copy()
        cv.imshow("level"+str(i+1), dst)  #展示图片
    return pyrdowm_imgs



def lapalian_demo(image):
    pyrdown_imgs = pyramid_demo(image) #拉普拉斯需要使用高斯金字塔的结果
    levels = len(pyrdown_imgs)  
    for i in range(levels-1, -1, -1):
        if i == 0:
            expand = cv.pyrUp(pyrdown_imgs[i], dstsize=image.shape[:2]) #这里的size必须和下一步相减的尺寸相同
            lpls = cv.subtract(image, expand) 
            cv.imshow("lpls"+str(i), lpls)
        else:
            expand = cv.pyrUp(pyrdown_imgs[i], dstsize=pyrdown_imgs[i-1].shape[:2])
            lpls = cv.subtract(pyrdown_imgs[i-1], expand)
            cv.imshow("lpls" + str(i), lpls)


print("----------------hello python opencv---------------------")
src = cv.imread("D:/pyhton/PhotoIditifyStuday/photo/girl.jpg") #读取原图片
cv.namedWindow("input_image", cv.WINDOW_AUTOSIZE)
cv.imshow("input_image", src)
lapalian_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

发布了7 篇原创文章 · 获赞 0 · 访问量 3146
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章