日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第11章:图像金字塔

發布時間:2023/12/8 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第11章:图像金字塔 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第11章:圖像金字塔

    • 一、理論基礎:
      • 1. 向下采樣:
      • 2. 向上采樣:
    • 二、pyrDown函數使用:
    • 三、pyrUp函數及使用:
    • 四、采樣可逆性研究
    • 五、拉普拉斯金字塔
      • 1. 定義:
      • 2. 應用:

什么是圖像金子塔?

? 圖像金字塔是由一幅圖像的多個不同分辨率的子圖構成的圖像集合。是通過一個圖像不斷的降低采樣率產生的,最小的圖像可能僅僅有一個像素點。下圖是一個圖像金子塔的示例。從圖中可以看到,圖像金字塔是一系列以金字塔形狀排列的、自底向上分辨率逐漸降低的圖像集合。

? 通常情況下,圖像金字塔的底部是待處理的高分辨率圖像(原始圖像),而頂部則為其低分辨率的近似圖像。向金字塔頂部移動時,圖像的尺寸和分辨率都不斷地降低。通常情況下,每向上移動一級,圖像的寬和高都降低為原來的二分之一。

一、理論基礎:

? 圖像金字塔是同一圖像不同分辨率的子圖集合,是通過原圖像不斷地向下降低采樣而產生的,即由高分辨率的圖像(大尺寸)產生低分辨率的近似圖像(小尺寸)。

1. 向下采樣:

? 最簡單的圖像金字塔可以通過不斷的刪除圖像的偶數行和偶數列得到的。例如,有一幅圖像,其大小是N*N,刪除其偶數行和偶數列后得到一幅(N/2)*(N/2)大小的圖像。經過上述處理后,圖像的大小變為原來的四分之一,不斷重復該過程,就可以得到該圖像的圖像金字塔。

? 也可以通過先對原始圖像濾波,得到原始圖像的近似圖像,然后將近似圖像的偶數行和偶數列刪除以獲取向下采樣的結果。有多種濾波器可以選擇。

  • 領域濾波器:采用鄰域平均值計算求原始圖像的近似圖像。該濾波器能夠產生平均金字塔。

  • 高斯濾波器:采用高斯濾波器對原始圖像進行濾波,得到高斯金字塔。這是OpenCV函數cv2.pyrDown()所采用的的方式。

    高斯金字塔是通過不斷地使用高斯金字塔濾波、采樣所產生的,其過程如下:

? 經過上述處理后,原始圖像與各次向下采樣所得到的結果圖像共同構成了高斯金字塔。例如,可以將原始圖像稱為第0層,第1次向下采樣的結果圖像稱為第一層、第2次向下采樣的結果圖像稱為第2層,以此類推。上述圖像所構成的高斯金字塔如圖所示。

? 下面為了表述統一,我們一律將圖像金字塔中底層稱為第0層,底層上面一層稱為第1層,并以此類推。

2. 向上采樣:

? 在向上采樣的過程中,通常將圖像的寬度和高度都變為原來的2倍。這意味著,向上采樣的結果圖像的大小是原始圖像的4倍。因此,要在結果圖像中補充大量的像素點。對新生成的像素點進行賦值的行為,稱為 插值。該過程可以通過多種方式實現,例如最鄰近插值就是使用最鄰近的像素點給當前還沒有值的像素點賦值。

? 還有一種常見的向上采樣,對像素點以補零的方式完成插值。通常是在每列像素點的右側插入值為零的列,在每行像素點的下方插入值為零的行。如圖,左側是要進行向上采樣的4個像素點,右側是向上采樣時進行補零后處理結果。

? 接下來,使用向下采樣時所使用的的高斯濾波器對補零后的圖像進行濾波處理,以獲取向上采樣的結果圖像。 但是需要注意,此時圖像中有四分之三的像素點的值都是零。所以,要將高斯濾波器系數乘以4,以保證得到的像素值在其原有像素值的范圍內。

? 例如,針對上圖右側的像素點,其對應的是8位圖像,像素值的范圍是[0, 255]。由于其中四分之三的像素點的值都是為零,如果直接使用高斯濾波器對其進行卷積計算,會導致像素值的范圍變為[0, 255*1/4]。所以,要將所使用的高斯濾波器系數乘以4,以保證得到像素值的范圍仍舊在[0, 255]內。

? 或者,從另一個角度理解,在原始圖像內每個像素點的右側列插入零值列,在每個像素點的下一行插入零值行,將圖像變為原來的兩倍寬、兩倍高。接下來,將補零后的圖像用高斯濾波器進行卷積運算。最后,將圖像內每個像素點的值乘以4,以保證像素值的范圍與原始圖像一致。

? 通過以上分析可知,向上采樣和向下采樣是相反的兩種操作。但是,由于上下采樣會丟失像素值,所以兩種操作并不是可逆的。 也就是說,對一幅圖像先向上采樣、再向下采樣,是無法恢復期原始狀態的;同樣,對一幅圖像先向下采樣、再向上采樣也是無法恢復到原始狀態的。

二、pyrDown函數使用:

在OpenCV中使用函數cv2.pyrDown(),實現圖像高斯金字塔操作中的向下采樣,語法形式為:

dst = cv2.pyrDown(src [, dstsize [, borderType] ])

  • dst:目標圖像
  • src:原始圖像
  • dstsize:目標圖像的大小
  • borderType:邊界類型,默認值為BORDER_DEFAULT,且這里僅支持BORDER_DEFAULT。

默認情況下,輸出圖像的大小為Size((src.cols+1)/2, (src.rows+1)/2)。在任何情況下,圖像的尺寸必須滿足如下條件:

  • |dst.width * 2 - src.cols| ≤ 2

    |dst.height * 2 - src.rows| ≤ 2

cv2.pyrDown()函數首先對原始圖像進行高斯濾波變換,以獲取原始圖像的近似圖像。在獲取近似圖像后,該函數通過拋棄偶數行和偶數列來實現向下采樣。

示例:

import cv2img = cv2.imread('../lena.bmp') rst1 = cv2.pyrDown(img) rst2 = cv2.pyrDown(rst1) rst3 = cv2.pyrDown(rst2)print('img.shape=', img.shape) print('rst1.shape=', rst1.shape) print('rst2.shape=', rst2.shape) print('rst3.shape=', rst3.shape)cv2.imshow('img', img) cv2.imshow('rst1', rst1) cv2.imshow('rst2', rst2) cv2.imshow('rst3', rst3)cv2.waitKey() cv2.destroyAllWindows()# 輸出結果 img.shape= (512, 512, 3) rst1.shape= (256, 256, 3) rst2.shape= (128, 128, 3) rst3.shape= (64, 64, 3)

三、pyrUp函數及使用:

在OpenCV中,使用函數cv2.pyrUp()實現圖像金字塔操作中的向上采樣,其語法格式為:

dst = cv2.pyrUp(src, [, dstsize [, borderType ] ] )

  • dst:目標圖像
  • src:原始圖像
  • dstsize:目標圖像的大小
  • borderType:邊界類型,默認值為BORDER_DEFAULT,且這里僅支持BORDER_DEFAULT。

默認情況下,輸出圖像的大小為Size(src.cols*2, src.rows*2)。在任何情況下,圖像的尺寸必須滿足如下條件:

  • |dst.width - src.cols * 2| ≤ mod(dst.widh, 2)

    |dst.height - src.rows * 2| ≤ mod(dst.height, 2)

? 在使用cv2.pyrUp()函數對圖像向上采樣時,在每個像素的右側、下方分別插入零值列和零值行,得到一個偶數行、偶數列(即新增的行、列)都是零值的新圖像New。接下來,用向下采樣時所使用的高斯濾波器對新圖像New進行濾波,得到向上采樣的結果圖像。需要注意的是,為了確保像素值的區間在向上采樣后與原始圖像保持一致,需要將高斯濾波器的系數乘以4。

示例:

import cv2img = cv2.imread('../boat.512.tiff') rst1 = cv2.pyrUp(img) rst2 = cv2.pyrUp(rst1) rst3 = cv2.pyrUp(rst2)print('img.shape=', img.shape) print('rst1.shape=', rst1.shape) print('rst2.shape=', rst2.shape) print('rst3.shape=', rst3.shape)cv2.imshow('img', img) cv2.imshow('rst1', rst1) cv2.imshow('rst2', rst2) cv2.imshow('rst3', rst3)cv2.waitKey() cv2.destroyAllWindows()# 輸出結果 img.shape= (64, 64, 3) rst1.shape= (128, 128, 3) rst2.shape= (256, 256, 3) rst3.shape= (512, 512, 3)

四、采樣可逆性研究

? 圖像在向上采樣后,整體尺寸變為原來的4倍;在向下采樣后,整體尺寸變為原來的四分之一。下圖展示了圖像在采樣前后的大小變化關系。一幅M*N大小的圖像經過向下采樣后大小會變為(M/2)*(N/2);一幅M*N大小的圖像經過向上采樣后大小會變為(2M)*(2N)

? 雖然一幅圖像在先后經過向下采樣、向上采樣后,會恢復原始大小,但是向上采樣和向下采樣不是互逆的。也就是說,雖然在經歷兩次采樣操作后,得到的結果圖像與原始圖像的大小一致,肉眼看起來也相似,但是二者的像素并不是一致的。

示例:

import cv2img = cv2.imread('../boat.512.tiff')down = cv2.pyrDown(img) up = cv2.pyrUp(down) diff = up - img print('img.shape=', img.shape) print('down.shape=', up.shape) cv2.imshow('img', img) cv2.imshow('up', up) cv2.imshow('diff', diff) cv2.waitKey() cv2.destroyAllWindows()# 輸出結果 img.shape= (512, 512, 3) down.shape= (512, 512, 3)

五、拉普拉斯金字塔

? 前面所介紹的高斯金字塔,是通過對一幅圖像一系列的向下采樣所產生的。有時,我們希望通過對金字塔中的小圖像進行向上采樣以獲取完整的大尺寸高分辨率圖像,這時就需要用到拉普拉斯金字塔。

1. 定義:

? 一幅圖像在經過向下采樣后,在對其進行向上采樣,是無法恢復為原始狀態的。對此,我們也用程序進行了驗證。向上采樣并不是向下采樣的逆運算。這很明顯,因為向下采樣時在使用高斯濾波器處理后還要拋棄偶數行,偶數列,不可避免的要丟失一些信息。

? 為了在向上采樣是能夠恢復具有較高分辨率的原始圖像,就要獲取在采樣過程中所丟失的信息,這些丟失的信息就構成了拉普拉斯金字塔。 也是拉普拉斯金字塔是有向下采樣時丟失的信息構成。

拉普拉斯金字塔的定義形式為:

  • Li = Gi - pyrUp( Gi + 1 )

式中:

  • Li:表示拉普拉斯金字塔中的第i層
  • Gi:表示高斯金字塔中的第i層

? 拉普拉斯金字塔中的第i層,等于"高斯金字塔中的第i層"與"高斯金字塔中的第 i + 1層的向上采樣結果"之差。下圖展示了高斯金字塔和拉普拉斯金字塔的對應關系。

示例:使用cv2.pyrDown()和cv2.pyrUp()構造拉普拉斯金子塔

import cv2img = cv2.imread('../boat.512.tiff') G1 = cv2.pyrDown(img) G2 = cv2.pyrDown(G1) G3 = cv2.pyrDown(G2)L0 = img - cv2.pyrUp(G1) L1 = G1 - cv2.pyrUp(G2) L2 = G2 - cv2.pyrUp(G3)print('L0.shape=', L0.shape) print('L1.shape=', L1.shape) print('L2.shape=', L2.shape)cv2.imshow('L0', L0) cv2.imshow('L1', L1) cv2.imshow('L2', L2) cv2.waitKey() cv2.destroyAllWindows()# 輸出結果 L0.shape= (512, 512, 3) L1.shape= (256, 256, 3) L2.shape= (128, 128, 3)

2. 應用:

拉普拉斯金字塔的作用在于,能夠恢復高分辨率的圖像。下圖演示了如何通過拉普拉斯金字塔恢復高分辨率圖像。

圖中各標記含義如下:

  • G0、G1、G2、G3分別是高斯金字塔的第0層、第1層、第2層、第3層。
  • L0、L1、L2、分別是拉普拉斯金字塔的第0層、第1層、第2層。
  • 向下的箭頭表示向下采樣操作(對應cv2.pyrDown()函數)
  • 向右的箭頭表示向上采樣操作(對應cv2.pyrUp() 函數)
  • "+"表示加法操作
  • "-"表示減法操作

上圖中的操作關系有:

向下采樣:

  • 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)

向上采樣恢復高分辨率圖像:

  • G0 = L0 + cv2.pyrUp(G1)
  • G1 = L1 + cv2.pyrUp(G2)
  • G2 = L2 + cv2.pyrUp(G3)

上述關系是通過數學運算推導得到的。例如,已知L0=G0-cv2.pyrUp(G1),將表達式右側的cv2.pyrUp(G1)移到左側,就得到了表達式G0 = L0 + cv2.pyrUp(G1)。除此之外,G1和G2都可以通過拉普拉斯金字塔的構造表達式得到。如之前介紹的,拉普拉斯金字塔的目的就是為了恢復高分辨率的圖像。

示例:使用拉普拉斯金字塔恢復高分辨率的圖像

import cv2 import numpy as npimg = cv2.imread('../boat.512.tiff')G0 = img 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)rst_G0 = L0 + cv2.pyrUp(G1) rst_G1 = L1 + cv2.pyrUp(G2) rst_G2 = L2 + cv2.pyrUp(G3)print('rst_G0', np.sum(abs(G0 - rst_G0))) print('rst_G1', np.sum(abs(G1 - rst_G1))) print('rst_G2', np.sum(abs(G2 - rst_G2)))cv2.imshow('G0', G0) cv2.imshow('G1', G1) cv2.imshow('G2', G2)cv2.imshow('rst_G0', rst_G0) cv2.imshow('rst_G1', rst_G1) cv2.imshow('rst_G2', rst_G2)cv2.waitKey() cv2.destroyAllWindows()

總結

以上是生活随笔為你收集整理的第11章:图像金字塔的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。