程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

OpenCV-Python快速入門(八):圖像金字塔

編輯:Python

OpenCV-Python快速入門(八):圖像金字塔

    • 前言
    • 前提條件
    • 實驗環境
    • 圖像金字塔
      • 高斯金字塔
        • cv2.pyrDown()實現圖像金字塔
        • cv2.pyrUp()實現圖像金字塔
      • 拉普拉斯金字塔
        • cv2.pyrDown()和 cv2.pyrUp()構造拉普拉斯金字塔
        • 應用:恢復高分辨率圖像
    • 參考文獻

前言

  • 本文是個人快速入門OpenCV-Python的電子筆記,由於水平有限,難免出現錯漏,敬請批評改正。
  • cv2.pyrUp()實現圖像金字塔

    import cv2
    import numpy as np
    img1=cv2.imread("1.jpg")
    img1_resize=cv2.resize(img1,(50,50))
    ''' dst = cv2.pyrUp( src[, dstsize[, borderType]] ) 參數說明: dst 為目標圖像。 src 為原始圖像。 dstsize 為目標圖像的大小。 borderType 為邊界類型 , 默認值為BORDER_DEFAULT , 且這裡僅支持BORDER_DEFAULT。 '''
    r1=cv2.pyrUp(img1_resize)
    r2=cv2.pyrUp(r1)
    r3=cv2.pyrUp(r2)
    cv2.imshow("origin",img1_resize)
    cv2.imshow("r1",r1)
    cv2.imshow("r2",r2)
    cv2.imshow("r3",r3)
    cv2.waitKey()
    cv2.destroyAllWindows()
    

    拉普拉斯金字塔

    • 一幅圖像在經過向下采樣後,再對其進行向上采樣,是無法恢復為原始狀態的。
    • 向上采樣並不是向下采樣的逆運算。這是很明顯的,因為向下采樣時在使用高斯濾波器處理後還要拋棄偶數行和偶數列,不可避免地要丟失一些信息。
    • 為了在向上采樣時能夠恢復具有較高分辨率的原始圖像,就要獲取在采樣過程中所丟失的信息,這些丟失的信息就構成了拉普拉斯金字塔。
    • 拉普拉斯金字塔的定義為 L i = G i − p y r U p ( G i + 1 ) L_i = G_i - pyrUp(G_i + 1) Li​=Gi​−pyrUp(Gi​+1)其中, L i L_i Li​ 表示拉普拉斯金字塔中的第 i i i層。 G i G_i Gi​表示高斯金字塔中的第 i i i層。

    cv2.pyrDown()和 cv2.pyrUp()構造拉普拉斯金字塔

    import cv2
    import numpy as np
    img1=cv2.imread("1.jpg")
    img1_resize=cv2.resize(img1,(400,400))
    ''' dst = cv2.pyrDown( src[, dstsize[, borderType]] ) dst = cv2.pyrUp( src[, dstsize[, borderType]] ) 參數說明: dst 為目標圖像。 src 為原始圖像。 dstsize 為目標圖像的大小。 borderType 為邊界類型 , 默認值為BORDER_DEFAULT , 且這裡僅支持BORDER_DEFAULT。 '''
    G0=img1_resize
    G1=cv2.pyrDown(G0)
    G2=cv2.pyrDown(G1)
    G3=cv2.pyrDown(G2)
    L0=G0-cv2.pyrUp(G1)
    L1=G1-cv2.pyrUp(G2)
    L2=G2-cv2.pyrUp(G3)
    cv2.imshow("L0",L0)
    cv2.imshow("L1",L1)
    cv2.imshow("L2",L2)
    cv2.waitKey()
    cv2.destroyAllWindows()
    

    應用:恢復高分辨率圖像

    import cv2
    import numpy as np
    img1=cv2.imread("1.jpg")
    img1_resize=cv2.resize(img1,(400,400))
    ''' dst = cv2.pyrDown( src[, dstsize[, borderType]] ) dst = cv2.pyrUp( src[, dstsize[, borderType]] ) 參數說明: dst 為目標圖像。 src 為原始圖像。 dstsize 為目標圖像的大小。 borderType 為邊界類型 , 默認值為BORDER_DEFAULT , 且這裡僅支持BORDER_DEFAULT。 '''
    G0=img1_resize
    G1=cv2.pyrDown(G0)
    L0=G0-cv2.pyrUp(G1)
    RO=L0+cv2.pyrUp(G1) # 通過拉普拉斯圖像復原的原始圖像
    print("GO.shape=",G0.shape)
    print("RO.shape=",RO.shape)
    res=RO-G0 # 將 G0 和 RO 做減法運算
    # 計算 res 的絕對值,避免求和時負負為正,3+(-3)=0
    res=abs(res)
    # 計算 res 所有元素的和
    print("原始圖像 GO 與恢復圖像 RO 之差的絕對值和:",np.sum(res))
    cv2.imshow("Origin_img_G0",G0)
    cv2.imshow("Laplacian_img_L0",L0)
    cv2.imshow("Restore_img_RO",RO)
    cv2.waitKey()
    cv2.destroyAllWindows()
    


    參考文獻

    [1] https://opencv.org/
    [2] 李立宗. OpenCV輕松入門:面向Python. 北京: 電子工業出版社,2019

    • 更多精彩內容,可點擊進入
      OpenCV-Python快速入門專欄或我的個人主頁查看

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved