Like Share Discussion Bookmark Smile

J.J. Huang   2026-02-10   Python OpenCV 05.特徵與進階篇   瀏覽次數:次   DMCA.com Protection Status

Python | OpenCV 圖片金字塔與多尺度分析

📚 前言

在前一篇我們學會了 相機校正與畸變矯正
在圖片處理與電腦視覺中,常常需要在不同解析度下觀察圖片特徵。
例如:人臉偵測、物件追蹤、特徵匹配,都需要在多種尺度下分析圖片。
這時候就會用到 圖片金字塔 (Image Pyramid)多尺度分析 (Multi-scale Analysis)

🔎 原理說明

  • 圖片金字塔:將圖片逐層縮小或放大,形成一個「金字塔結構」。
    • 高層:解析度低,圖片小。
    • 低層:解析度高,圖片大。
  • 用途
    • 在不同尺度下偵測特徵。
    • 加速演算法,避免在原始大圖片上做大量計算。
    • 提供多層次的圖片表示,方便進行匹配或搜尋。

🧠 函式與參數說明

📌 cv2.pyrDown()

用途:將圖片縮小一半,並同時進行高斯模糊,避免縮小時產生鋸齒或 aliasing。

1
smaller = cv2.pyrDown(img)
  • img:輸入圖片。
  • smaller:縮小並平滑後的圖片。

📌 cv2.pyrUp()

用途:將圖片放大一倍,並同時進行插值與模糊,使放大後的圖片保持平滑。

1
larger = cv2.pyrUp(img)
  • img:輸入圖片。
  • larger:放大並平滑後的圖片。

📌 拉普拉斯金字塔 (Laplacian Pyramid)

用途:由高斯金字塔相鄰層的差異構成,常用於圖片壓縮與融合。
它能保留圖片的細節資訊,並在多尺度下進行分析。
例如:將兩張圖片利用拉普拉斯金字塔進行平滑融合,避免邊界突兀。

1
2
gaussian_expanded = cv2.pyrUp(gp[i], dstsize=gp[i-1].shape[1::-1])
laplacian = cv2.subtract(gp[i-1], gaussian_expanded)
  • gp:高斯金字塔。
  • gaussian_expanded:放大後的高斯圖片,與上一層對齊。
  • laplacian:相鄰層的差異,代表該層的細節資訊。

💻 範例程式 — 建立圖片金字塔

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import cv2

img = cv2.imread("test.png") # 部落格頭像

# 建立金字塔
smaller = cv2.pyrDown(img)
larger = cv2.pyrUp(img)

cv2.imshow("Original", img)
cv2.imshow("PyrDown", smaller)
cv2.imshow("PyrUp", larger)

cv2.waitKey(0)
cv2.destroyAllWindows()


圖:原始圖片、縮小一層、放大一層

💻 範例程式 — 多層金字塔

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import cv2

img = cv2.imread("test.png") # 部落格頭像

layer = img.copy()
gp = [layer]

# 建立高斯金字塔 (Gaussian Pyramid)
for i in range(3):
layer = cv2.pyrDown(layer)
gp.append(layer)

# 顯示不同層次
for i, layer in enumerate(gp):
cv2.imshow(f"Layer {i}", layer)

cv2.waitKey(0)
cv2.destroyAllWindows()


圖:高斯金字塔 — 逐層縮小圖片

💻 範例程式 — 拉普拉斯金字塔 (Laplacian Pyramid)

拉普拉斯金字塔常用於圖片壓縮與重建。
它是由高斯金字塔相鄰層的差異構成。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import cv2

img = cv2.imread("test.png") # 部落格頭像
layer = img.copy()
gp = [layer]

# 建立高斯金字塔
for i in range(3):
layer = cv2.pyrDown(layer)
gp.append(layer)

# 建立拉普拉斯金字塔
lp = []
for i in range(3, 0, -1):
# 保證大小一致
gaussian_expanded = cv2.pyrUp(gp[i], dstsize=gp[i-1].shape[1::-1])
laplacian = cv2.subtract(gp[i-1], gaussian_expanded)
lp.append(laplacian)

# 顯示拉普拉斯金字塔
for i, layer in enumerate(lp):
cv2.imshow(f"Laplacian {i}", layer)

cv2.waitKey(0)
cv2.destroyAllWindows()


圖:拉普拉斯金字塔 — 顯示不同層次的差異

⚠️ 注意事項

  • pyrDownpyrUp 只能處理圖片大小為偶數的情況,否則可能會有誤差。
  • 金字塔層數不宜過多,否則圖片會過度模糊或失真。
  • 拉普拉斯金字塔常用於圖片壓縮與融合。

📊 應用場景

  • 人臉偵測:在不同尺度下搜尋人臉。
  • 圖片融合:利用拉普拉斯金字塔進行平滑融合。
  • 特徵匹配:在多尺度下比對圖片特徵。
  • 圖片壓縮:利用金字塔結構進行高效壓縮。

🎯 結語

本篇我們學會了 圖片金字塔 (Image Pyramid)多尺度分析 (Multi-scale Analysis),並透過 OpenCV 的 pyrDownpyrUp 建立高斯金字塔與拉普拉斯金字塔。
這些技術在電腦視覺中非常常見,尤其在人臉偵測、圖片融合與特徵匹配等應用中。

📖 如在學習過程中遇到疑問,或是想了解更多相關主題,建議回顧一下 Python | OpenCV 系列導讀,掌握完整的章節目錄,方便快速找到你需要的內容。

註:以上參考了
OpenCV Tutorials
OpenCV-Python Tutorials