圖像金字塔

目錄

  • 圖像金字塔介紹
  • 圖像金字塔的分類
    (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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章