OpenCV計算機視覺實戰(12)——圖像金字塔與特征縮放

OpenCV計算機視覺實戰(12)——圖像金字塔與特征縮放

    • 0. 前言
    • 1. 高斯金字塔
      • 1.1 應用場景
      • 1.2 實現過程
    • 2. 拉普拉斯金字塔
      • 2.1 應用場景
      • 2.2 實現過程
    • 3. 圖像融合實例
      • 3.1 應用場景
      • 3.2 實現過程
    • 小結
    • 系列鏈接

0. 前言

圖像金字塔技術通過對原始圖像按不同分辨率進行多層次表示,不僅能提升計算效率,還能為圖像融合、檢測與識別提供多尺度特征。高斯金字塔 (Gaussian Pyramid) 用于構建多級低通圖像,拉普拉斯金字塔 (Laplacian Pyramid) 則提取各層之間的細節信息。本節將深入介紹如何使用 OpenCV 構建高斯與拉普拉斯金字塔,并以經典的圖像融合案例,展示圖像金字塔在特征縮放與融合中的強大應用。

1. 高斯金字塔

高斯金字塔通過不斷下采樣與高斯平滑,將圖像分解為一系列分辨率逐漸降低的圖像,用于多尺度分析與加速算法。

1.1 應用場景

  • 多尺度目標檢測:在目標尺寸未知或變化劇烈的場景(如行人檢測、車牌識別)下,高斯金字塔可幫助算法在不同分辨率圖像上快速定位目標
  • 加速模板匹配:先在低分辨率層做初步匹配,再在高分辨率層精細搜索,大幅減少計算量
  • 圖像預覽:在線地圖或大尺寸全景圖瀏覽,用金字塔在不同縮放級別下平滑加載

1.2 實現過程

  • 初次平滑:避免混疊
    • 由于下采樣會丟棄高頻信息,先用 cv2.GaussianBlur 做一次適度平滑
    • 核大小 ksize = 2·?3*alpha? + 1,一般 alpha1.0~1.5
  • 連續下采樣
    • cv2.pyrDown 會自動結合 5 × 5 高斯濾波與采樣,對比手動 GaussianBlur + resize 更高效且抗混疊
    • 每層分辨率縮小為前一層的 1 2 \frac 12 21?,層數視應用而定
  • 可視化
    • 將各層圖像拼接或依次顯示,便于對比分辨率變化
import cv2
import numpy as np# 1. 讀取并預平滑
img = cv2.imread('1.jpeg')
alpha = 1.2
ksize = int(2 * np.ceil(3*alpha) + 1)
blur = cv2.GaussianBlur(img, (ksize, ksize), alpha)# 2. 構建高斯金字塔(5 層)
gp = [blur]
for i in range(1, 5):gp.append(cv2.pyrDown(gp[i-1]))# 3. 顯示各層
for idx, layer in enumerate(gp):cv2.imshow(f'Gaussian Level {idx}', layer)
cv2.waitKey(0)
cv2.destroyAllWindows()

高斯金字塔

關鍵函數解析:

  • cv2.pyrDown(src):對輸入圖像做高斯濾波后,下采樣至寬高各自減半
  • cv2.GaussianBlur(src, ksize, sigma):在下采樣前做平滑,減少高頻信息引發的混疊效應

2. 拉普拉斯金字塔

拉普拉斯金字塔通過相鄰兩層高斯金字塔的差分,提取出各尺度的細節信息,可用于圖像重建與增強。

2.1 應用場景

  • 圖像壓縮:只存儲拉普拉斯層與頂層高斯圖,就能高效重建原圖
  • 特效增強:對細節層做強化或減弱,可實現“銳化”“虛化”特效
  • 多分辨率融合:在圖像融合中,用拉普拉斯金字塔融合能避免明顯拼接痕跡

2.2 實現過程

  • 構建高斯金字塔
    • 使用上一節生成的高斯金字塔列表 gp
  • 計算拉普拉斯層
    • 對于第 i i i 層高斯圖像,將其上采樣 (pyrUp),使其尺寸與第 i ? 1 i-1 i?1 層對齊
    • 將第 i ? 1 i-1 i?1 層高斯圖像減去上采樣結果,得到第 i ? 1 i-1 i?1 層的拉普拉斯圖像
    • 最后一層直接作為拉普拉斯金字塔的頂層
  • 重建驗證
    • 從頂層開始,依次上采樣并與對應拉普拉斯層相加,驗證重建結果與原圖接近
import cv2
import numpy as np# 1. 讀取并預平滑
img = cv2.imread('1.jpeg')
alpha = 1.2
ksize = int(2 * np.ceil(3*alpha) + 1)
blur = cv2.GaussianBlur(img, (ksize, ksize), alpha)# 2. 構建高斯金字塔(5 層)
gp = [blur]
for i in range(1, 5):gp.append(cv2.pyrDown(gp[i-1]))# 3. 構建拉普拉斯金字塔
lp = []
for i in range(4):up = cv2.pyrUp(gp[i+1], dstsize=(gp[i].shape[1], gp[i].shape[0]))lap = cv2.subtract(gp[i], up)lp.append(lap)
lp.append(gp[-1])  # 頂層# 4. 重建圖像
recon = lp[-1]
for i in range(3, -1, -1):recon = cv2.pyrUp(recon, dstsize=(lp[i].shape[1], lp[i].shape[0]))recon = cv2.add(recon, lp[i])cv2.imshow('Reconstructed', recon)
cv2.waitKey(0)
cv2.destroyAllWindows()

拉普拉斯金字塔

關鍵函數解析:

  • cv2.pyrUp(src, dstsize):將圖像上采樣至目標尺寸,并做插值平滑
  • cv2.subtract(src1, src2):逐像素相減,提取細節層
  • cv2.add(src1, src2):逐像素相加,用于圖像重建

3. 圖像融合實例

接下來,利用拉普拉斯金字塔將兩幅圖像在多尺度上分解,逐層融合細節,再重建,實現平滑且無明顯接縫的混合效果。

3.1 應用場景

  • 無縫拼接:將兩張風格迥異的圖像在中間或曲線邊界處平滑融合(如半臉融合、天空拼接)
  • 曝光融合:不同曝光度的同一場景,用多尺度融合獲得 HDR 效果
  • 拼貼藝術:在廣告、海報設計中,通過金字塔融合創造奇幻視覺效果

3.2 實現過程

  • 圖像準備與對齊
    • 確保兩幅圖尺寸一致
    • 若需要變形對齊,可先用特征匹配 + 單應性 (Homography) 校正
  • 構建金字塔
    • 高斯:gp1, gp2
    • 拉普拉斯:lp1, lp2
  • 層級融合策略
    • 硬切:每層直接水平或豎直拼接
    • 漸變掩碼:對每層生成一個軟掩碼(如高斯模糊的二值斑塊),按權重混合 L = M·L1 + (1?M)·L2
    • 多掩碼:根據圖像內容動態選取掩碼,如人臉融合時在面部區域采用圓形漸變
  • 金字塔重建
    • 從頂層小圖開始,逐層上采樣、與融合后的拉普拉斯層相加
    • 重建后可做全局色調/對比度微調,讓拼接邊界更自然
import cv2
import numpy as np# 1. 讀取與對齊
img1 = cv2.imread('1.jpeg')
img2 = cv2.imread('2.jpeg')
img2 = cv2.resize(img2, (img1.shape[1], img1.shape[0]))# 2. 構建高斯金字塔
def build_gp(img, levels=6):gp = [img]for _ in range(levels):gp.append(cv2.pyrDown(gp[-1]))return gpgp1, gp2 = build_gp(img1), build_gp(img2)# 3. 構建拉普拉斯金字塔
def build_lp(gp):lp = []for i in range(len(gp)-1):up = cv2.pyrUp(gp[i+1], dstsize=(gp[i].shape[1], gp[i].shape[0]))lp.append(cv2.subtract(gp[i], up))lp.append(gp[-1])return lplp1, lp2 = build_lp(gp1), build_lp(gp2)# 4. 生成漸變掩碼金字塔
mask = np.zeros_like(img1, dtype=np.float32)
# 中心向左右平滑過渡
cols = img1.shape[1]
mask[:, :cols//2] = 1.0
mask = cv2.GaussianBlur(mask, (51,51), 0)
gp_mask = build_gp((mask*255).astype(np.uint8), levels=6)# 5. 融合拉普拉斯層
lp_fused = []
for l1, l2, gm in zip(lp1, lp2, gp_mask):gm_f = gm.astype(np.float32)/255fused = (l1.astype(np.float32)*gm_f + l2.astype(np.float32)*(1-gm_f))lp_fused.append(fused.astype(np.uint8))# 6. 重建融合圖
fused = lp_fused[-1]
for i in range(len(lp_fused)-2, -1, -1):fused = cv2.pyrUp(fused, dstsize=(lp_fused[i].shape[1], lp_fused[i].shape[0]))fused = cv2.add(fused, lp_fused[i])# 7. 全局微調
fused = cv2.detailEnhance(fused, sigma_s=10, sigma_r=0.15)cv2.imshow('Pyramid Blended', fused)
cv2.waitKey(0)
cv2.destroyAllWindows()

圖像融合

關鍵函數解析:

  • 漸變掩碼:用 cv2.GaussianBlur 將硬掩碼平滑,實現層級軟混合
  • build_gp / build_lp:封裝高斯與拉普拉斯金字塔構建流程,便于復用
  • cv2.detailEnhance(src, sigma_s, sigma_r):調節融合后細節與對比度,OpenCV 的畫龍點睛
  • 多級融合策略:硬切、軟掩碼、基于內容的掩碼,用于不同藝術或工程需求

小結

在本節中,我們介紹了如何在 OpenCV 中構建圖像金字塔、提取多尺度特征,并應用于無縫圖像融合。掌握這些技術,能夠為圖像處理、計算機視覺和深度學習任務提供強有力的多尺度支持。

系列鏈接

OpenCV計算機視覺實戰(1)——計算機視覺簡介
OpenCV計算機視覺實戰(2)——環境搭建與OpenCV簡介
OpenCV計算機視覺實戰(3)——計算機圖像處理基礎
OpenCV計算機視覺實戰(4)——計算機視覺核心技術全解析
OpenCV計算機視覺實戰(5)——圖像基礎操作全解析
OpenCV計算機視覺實戰(6)——經典計算機視覺算法
OpenCV計算機視覺實戰(7)——色彩空間詳解
OpenCV計算機視覺實戰(8)——圖像濾波詳解
OpenCV計算機視覺實戰(9)——閾值化技術詳解
OpenCV計算機視覺實戰(10)——形態學操作詳解
OpenCV計算機視覺實戰(11)——邊緣檢測詳解

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/86604.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/86604.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/86604.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【案例】基于Python的生源數據可視化分析:從Excel處理到動態地圖展示

文章目錄 需求分析技術要點程序流程一些細節核心代碼表格的一些操作 心得體會代碼匯總 需求分析 請設計一個程序,要求能夠統計分析分散在不同表格中的數萬條信息,以信息中的身份證號碼或生源地代碼字段為目標字段,統計每一年全國各省份及本省…

設計模式 | 原型模式

原型模式通過克隆機制實現對象高效創建,是性能敏感場景的利器。本文結合C示例詳解實現原理、深拷貝陷阱、應用場景,并與工廠模式對比分析。 為何需要原型模式? 當遇到以下場景時,傳統構造方法面臨挑戰: 創建成本高&am…

Go 語言中的單元測試

1、如何編寫單元測試 在任何生產級別的項目開發中,單元測試都扮演著至關重要的角色。盡管許多初創項目在早期可能忽略了它,但隨著項目逐漸成熟并成為核心業務,為其編寫健壯的單元測試是保障代碼質量和項目穩定性的必然選擇。本文將帶您快速掌…

8. 接口專業測試報告生成pytest-html

pytest-html 終極指南:打造專業級接口測試報告 在接口自動化測試中,清晰的測試報告是質量保障的關鍵。本文將深入解析如何通過pytest-html插件生成專業級測試報告。 一、核心安裝與基礎使用 快速安裝(國內鏡像) pip install -i …

Day45 Tensorboard使用介紹

目錄 一、tensorboard的發展歷史和原理及基本操作 1.1 發展歷史 1.2 tensorboard的原理 1.3 日志目錄自動管理 1.4 記錄標量數據(Scalar) 1.5 可視化模型結構(Graph) 1.6 可視化圖像(Image) 1.7 記…

用AI給AR加“智慧”:揭秘增強現實智能互動的優化秘密

用AI給AR加“智慧”:揭秘增強現實智能互動的優化秘密 引子:增強現實,到底還能怎么更聰明? 還記得當年Pokmon GO火爆全球的場景嗎?玩家們手機對準街頭,虛擬小精靈活靈活現地跳出來,那就是增強現實(AR)最經典的應用之一。隨著硬件發展和算法進步,AR正逐步從“炫酷玩具…

1 Studying《Computer Vision: Algorithms and Applications 2nd Edition》1-5

目錄 Chapter 1 Introduction 1.1 什么是計算機視覺? 1.2 簡史 1.3 書籍概述 1.4 樣本教學大綱 1.5 符號說明 1.6 其他閱讀材料 Chapter 2 Image formation 2.1 幾何基本元素和變換 2.2 光度圖像形成 2.3 數碼相機 2.4 其他閱讀材料 2.5 練習 Chapter…

Augment插件macOS

macOS蘋果電腦vscode-augment免費額度續杯跑滿 前言 在AI輔助編程日益普及的今天,Augment作為VS Code中的智能代碼助手,為開發者提供了強大的代碼生成和優化功能。然而,免費版本每月300次的使用限制往往讓重度用戶感到困擾。本文將詳細介紹如…

OpenCV CUDA模塊設備層-----創建一個“常量指針訪問器” 的工具函數constantPtr()

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 在 CUDA 設備端模擬一個“指向常量值”的虛擬指針訪問器,使得你可以像訪問數組一樣訪問一個固定值。 這在某些核函數中非常有用&…

Python:操作 Excel 刪除工作簿

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】 【測試經驗】 【人工智能】 【Python】 Python 操作 Excel 系列 讀取單元格數據按行寫入設置行高和列寬自動調整行高和列寬水平…

Python類型注解(Type Hints)的工程實踐指南

一、類型注解的核心價值 代碼可讀性:明確函數輸入輸出類型 靜態檢查:配合mypy提前發現類型錯誤 IDE支持:提升代碼補全和重構能力 文檔替代:類型即文檔的現代編程理念 二、基礎語法規范 def greet(name: str, times: int 1)…

Hadoop RPC 分層設計的哲學:高內聚、低耦合的最佳實踐

Hadoop RPC Hadoop RPC主要分為四個部分,分別是序列化層、函數調用層、網絡傳輸層和服務器端處理框架,實現機制為: 序列化層:主要作用是將結構化對象轉為字節流以便于通過網絡進行傳輸或寫入持久存儲。函數調用層:主…

MybatisPlus-01.MybatisPlus介紹

一.MybatisPlus介紹 MybatisPlus是對Mybatis的增強和升級,但需要注意的是,MybatisPlus并不是取代Mybatis的,而是要做Mybatis最好的合作伙伴。左邊藍色的小鳥就是MybatisPlus的標志。 在MybatisPlus官方頁面上介紹了其特點,首先&am…

人大金倉數據庫jdbc連接jar包kingbase8-8.6.0.jar驅動包最新版下載(不需要積分)

看了網上的很多,都是需要下載積分的 分享一下直接訪問人大金倉官網,下載對應的數據庫jdbc連接jar包kingbase8-8.6.0.jar驅動包: 點擊 服務與支持,然后選擇 下載中心 選擇對應的產品和版本,最后選擇軟件版本 看到有…

cf 禁止http/1.0和http/1.1的訪問 是否會更安全?

使用 Cloudflare(CF)禁止 HTTP/1.0 和 HTTP/1.1 的訪問,強制客戶端使用 HTTP/2 或更高版本(如 HTTP/3),在某些情況下可以提升網站安全性,但也存在權衡和限制。以下是詳細分析,幫你判…

【Docker基礎】Docker容器管理:docker pause詳解

目錄 1 Docker容器管理概述 2 docker pause命令詳解 2.1 命令基本語法 2.2 命令功能解析 2.3 暫停與停止的區別 3 docker pause的工作流程 3.1 工作流程概述 3.2 工作流程詳解 4 docker pause的使用場景 4.1 資源臨時調整 4.2 調試與檢查 4.3 服務維護 4.4 數據備…

Springboot ResponseBodyAdvice 的小妙用

最近公司接觸到了政府項目,在開發完成后,需要對代碼做安全掃描,對系統做安全測試,在安全測試中有一項不合格,就是接口返回錯誤是,錯誤不是瀏覽器級別的,什么意思呢,一般我們都會封裝…

Re:從零開始的文件結構(融合線性表來理解 考研向)

文件管理 & 線性表 文件管理文件的結構無結構文件 有結構文件(重點)定長與不定長記錄順序文件(類線性表)它的邏輯結構它的物理結構(存儲結構)小結 索引順序文件與多級索引順序文件形象化理解&#xff0…

并發基礎7(守護線程)

目錄 1:什么守護線程 2:守護線程使用 3:守護線程案例 1:什么守護線程 守護線程是Java中的一種特殊的線程類型,它為其他線程(非守護線程)提供后臺支持服務。 在Java多線程編程中&#xff0c…

蜣螂算法+四模型對比!DBO-CNN-BiLSTM-Attention系列四模型多變量時序預測

蜣螂算法四模型對比!DBO-CNN-BiLSTM-Attention系列四模型多變量時序預測(Matlab完整源碼和數據) 目錄 蜣螂算法四模型對比!DBO-CNN-BiLSTM-Attention系列四模型多變量時序預測(Matlab完整源碼和數據)效果一…