OpenCV圖像金字塔詳解:原理、實現與應用

一、什么是圖像金字塔?

圖像金字塔是圖像處理中一種重要的多尺度表示方法,它通過對圖像進行重復的平滑和降采樣(或上采樣)操作,生成一系列分辨率逐漸降低(或升高)的圖像集合。這種結構形似金字塔,因此得名"圖像金字塔"。

圖像金字塔在計算機視覺領域有著廣泛的應用,包括:

  • 圖像融合與無縫拼接
  • 目標檢測(如人臉檢測)
  • 圖像分割
  • 特征提取
  • 圖像壓縮等

二、圖像金字塔的類型

OpenCV中主要支持兩種類型的圖像金字塔:

1. 高斯金字塔(Gaussian Pyramid)

高斯金字塔是通過不斷對圖像進行高斯平滑和下采樣得到的。每一層圖像都是前一層圖像經過高斯模糊后,再隔行隔列降采樣得到的。

構建過程:

  1. 對當前層圖像進行高斯模糊
  2. 刪除所有的偶數行和偶數列
  3. 得到的新圖像就是金字塔的下一層

2. 拉普拉斯金字塔(Laplacian Pyramid)

拉普拉斯金字塔是由高斯金字塔構建而來的,它保存的是高斯金字塔每一層與其上一層擴展后的差異信息。可以看作是圖像的邊緣和細節信息。

構建過程:

  1. 對高斯金字塔的某一層圖像進行上采樣
  2. 用高斯核對上采樣后的圖像進行卷積(近似擴展)
  3. 計算擴展后的圖像與上一層圖像的差異
  4. 這個差異圖像就是拉普拉斯金字塔的當前層

三、OpenCV中的圖像金字塔實現

OpenCV提供了pyrDown()pyrUp()函數來構建高斯金字塔,而拉普拉斯金字塔可以通過高斯金字塔計算得到。

1.1 高斯金字塔實現(下采樣)

import cv2
from cv2 import IMREAD_GRAYSCALE'''--------------高斯金字塔操作中的向下采樣----------------'''
#先進行高斯濾波
#再刪除其偶數行與偶數列,完成一次下采樣#  下采樣 是一種減小圖像尺寸的方法,它通常涉及到降低圖像的分辨率,即減少圖像中像素的數量,從而使圖像看起來更小。
#  上采樣 是一種增大圖像尺寸的方法,它通過插值和濾波技術來恢復圖像的分辨率和細節,通常用于圖像放大或者與下采樣后的圖像進行比較。
#  resize函數  是一種通用的圖像尺寸調整方法,它可以按照指定的目標尺寸來縮放圖像,不涉及金字塔結構或者特定的濾波操作。# dst = cv2.pyrDown(src [,dst, dstsize [, borderType] ])
# dst:目標圖像
# src:原始圖像
# dstsize:目標圖像的大小face=cv2.imread('face.png',IMREAD_GRAYSCALE)
cv2.imshow('face',face)
cv2.waitKey(0)face_down_1=cv2.pyrDown(face)  #下采樣處理
cv2.imshow('down_1',face_down_1)
cv2.waitKey(0)face_down_2=cv2.pyrDown(face_down_1)
cv2.imshow('down_2',face_down_2)
cv2.waitKey(0)face_down_1_up=cv2.pyrUp(face_down_1)
face_down_2_up=cv2.pyrUp(face_down_2)cv2.imshow('down_1_up',face_down_1_up)
cv2.imshow('down_2_up',face_down_2_up)
cv2.waitKey(0)cv2.destroyAllWindows()

1.2 高斯金字塔實現(上采樣)

import cv2
from cv2 import IMREAD_GRAYSCALE'''--------------高斯金字塔操作中的向下采樣----------------'''
#插值
#高斯濾波#  下采樣 是一種減小圖像尺寸的方法,它通常涉及到降低圖像的分辨率,即減少圖像中像素的數量,從而使圖像看起來更小。
#  上采樣 是一種增大圖像尺寸的方法,它通過插值和濾波技術來恢復圖像的分辨率和細節,通常用于圖像放大或者與下采樣后的圖像進行比較。
#  resize函數  是一種通用的圖像尺寸調整方法,它可以按照指定的目標尺寸來縮放圖像,不涉及金字塔結構或者特定的濾波操作。# dst = cv2.pyrDown(src [,dst, dstsize [, borderType] ])
# dst:目標圖像
# src:原始圖像
# dstsize:目標圖像的大小face=cv2.imread('face.png',IMREAD_GRAYSCALE)
cv2.imshow('face',face)
cv2.waitKey(0)face_up_1=cv2.pyrUp(face)
cv2.imshow('up_1',face_up_1)
cv2.waitKey(0)face_up_2=cv2.pyrUp(face_up_1)
cv2.imshow('up_2',face_up_2)
cv2.waitKey(0)face_up_1_down=cv2.pyrDown(face_up_1)
face_up_2_down=cv2.pyrDown(face_up_2)cv2.imshow('up_1_down',face_up_1_down)
cv2.imshow('up_2_down',face_up_2_down)
cv2.waitKey(0)cv2.destroyAllWindows()

2. 拉普拉斯金字塔實現

import cv2'''---------------拉普拉斯金字塔------------------'''#由原圖的采樣時丟失的信息組成的face=cv2.imread('face.png',cv2.IMREAD_GRAYSCALE)
cv2.imshow('face',face)
cv2.waitKey(0)face_down_1=cv2.pyrDown(face)
face_down_2=cv2.pyrDown(face_down_1)face_up_1=cv2.pyrUp(face)
face_up_2=cv2.pyrUp(face_up_1)face_down_1_up=cv2.pyrUp(face_down_1)
face_down_2_up=cv2.pyrUp(face_down_2)#獲取損失信息
L0=face-face_down_1_up
L1=face_down_1-face_down_2_upfuyuan=face_down_1_up+L0cv2.imshow('L0',L0)
cv2.imshow('L1',L1)
cv2.waitKey(0)
cv2.imshow('fuyuan',fuyuan)
cv2.waitKey(0)cv2.destroyAllWindows()

四、圖像金字塔的應用實例

1. 圖像融合

圖像金字塔常用于圖像融合,如將兩張圖像無縫拼接在一起:

def image_blending(img1, img2, mask, levels=6):# 生成高斯金字塔G1 = img1.copy()G2 = img2.copy()GM = mask.copy()gp1 = [G1]gp2 = [G2]gpM = [GM]for i in range(levels):G1 = cv2.pyrDown(G1)G2 = cv2.pyrDown(G2)GM = cv2.pyrDown(GM)gp1.append(G1)gp2.append(G2)gpM.append(GM)# 生成拉普拉斯金字塔lp1 = [gp1[levels-1]]lp2 = [gp2[levels-1]]gpMr = [gpM[levels-1]]for i in range(levels-1, 0, -1):size = (gp1[i-1].shape[1], gp1[i-1].shape[0])L1 = cv2.subtract(gp1[i-1], cv2.pyrUp(gp1[i], dstsize=size))L2 = cv2.subtract(gp2[i-1], cv2.pyrUp(gp2[i], dstsize=size))lp1.append(L1)lp2.append(L2)gpMr.append(gpM[i-1])# 融合LS = []for l1, l2, gm in zip(lp1, lp2, gpMr[::-1]):gm = gm/255.0ls = l1 * gm + l2 * (1.0 - gm)LS.append(ls)# 重建圖像ls_ = LS[0]for i in range(1, levels):size = (LS[i].shape[1], LS[i].shape[0])ls_ = cv2.add(cv2.pyrUp(ls_, dstsize=size), LS[i])return ls_# 使用示例
img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')
mask = cv2.imread('mask.jpg', 0)  # 二值掩模result = image_blending(img1, img2, mask)
cv2.imshow('Blended Image', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

2. 圖像超分辨率

雖然圖像金字塔主要用于降采樣,但結合深度學習等方法,金字塔結構也可以用于圖像超分辨率任務。

五、性能優化與注意事項

  1. 金字塔層數選擇:金字塔的層數不宜過多,一般不超過6-7層,否則最高層的圖像會太小而失去意義。

  2. 邊界處理:在進行金字塔操作時,OpenCV會自動處理邊界問題,但如果需要自定義實現,需要注意邊界條件的處理。

  3. 內存考慮:構建金字塔會生成多幅圖像,占用較多內存,在處理大圖像時需要注意。

  4. 性能優化:對于實時應用,可以考慮只構建必要的金字塔層級,或者使用ROI(感興趣區域)來減少計算量。

六、總結

圖像金字塔是計算機視覺中一項基礎而重要的技術,它通過多尺度表示圖像信息,為許多高級視覺任務提供了便利。OpenCV提供了簡單易用的金字塔構建函數,使得開發者可以輕松實現各種基于金字塔的算法。掌握圖像金字塔的原理和應用,將有助于你解決更復雜的圖像處理問題。

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

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

相關文章

收集飛花令碎片——C語言分支與循環語句(上)

前言 Hello,各位碼友,本章將會給大家帶來C語言的分支與循環整章串講,這一張的內容分為基礎知識和程序練習兩個部分 希望通過這一章能夠帶大家更好地去掌握C語言的分支與循環語句 大家一起努力吧 C語言分支與循環語句(基礎知識) C…

嵌入式硬件篇---TOF|PID

文章目錄 前言1. 硬件準備主控芯片ToF模塊1.VL53L0X2.TFmini 執行機構:電機舵機其他 2. 硬件連接(1) VL53L0X(IC接口)(2) TFmini(串口通信) 3. ToF模塊初始化與數據讀取(1) VL53L0X(基于HAL庫)(…

PCB設計實踐(十二)PCB設計電容選型:功能、材質、規則

在PCB設計中,電容作為基礎元件承擔著濾波、儲能、去耦、耦合等核心功能。其分類與使用規則直接影響電路穩定性、抗干擾能力和信號完整性。本文從工程實踐角度系統梳理PCB設計中電容的五大分類、選型規范及布局布線規則,幫助設計者構建科學的電容應用體系…

vue2關閉eslint

在項目根目錄下找到 vue.config.js 文件。如果沒有該文件,可以直接在項目根目錄創建一個。 2. 添加 lintOnSave: false 配置 module.exports {lintOnSave: false };

MyBatis 一對多關聯映射在Spring Boot中的XML配置

在Spring Boot中使用MyBatis實現一對多關系時,可以通過XML映射文件來配置。下面我將詳細介紹幾種實現方式。 基本概念 一對多關系指的是一個實體對象包含多個子對象集合的情況,例如: 一個部門有多個員工一個訂單有多個訂單項一個博客有多個…

基于Stable Diffusion XL模型進行文本生成圖像的訓練

基于Stable Diffusion XL模型進行文本生成圖像的訓練 flyfish export MODEL_NAME"stabilityai/stable-diffusion-xl-base-1.0" export VAE_NAME"madebyollin/sdxl-vae-fp16-fix" export DATASET_NAME"lambdalabs/naruto-blip-captions"acceler…

基于React的高德地圖api教程001:初始化地圖

文章目錄 1、初始化地圖1.1 創建react項目1.2 可視化地圖1.3 設置衛星地圖1.4 添加開關開啟3D地圖1.5 代碼下載1、初始化地圖 1.1 創建react項目 創建geodeapi項目: npx create-react-app gaodeapi安裝高德地圖包: npm install @amap/amap-jsapi-loader1.2 可視化地圖 在…

uniapp使用npm下載

uniapp的項目在使用HBuilder X創建時是不會有node_modules文件夾的,如下圖所示: 但是uni-app不管基于哪個框架,它內部一定是有node.js的,否則沒有辦法去實現框架層面的一些東西,只是說它略微有點差異。具體差異表現在…

輕量在線工具箱系統源碼 附教程

源碼介紹 輕量在線工具箱系統源碼,直接扔服務器 修改config/config.php文件里面的數據庫 后臺賬號admin 密碼admin123 本工具是AI寫的 所以工具均是第三方接口直接寫的。 需要加工具直接自己找接口寫好扔到goju目錄 后臺自動讀取 效果預覽 源碼獲取 輕量在線工具箱系統源…

圖解gpt之Seq2Seq架構與序列到序列模型

今天深入探討如何構建更強大的序列到序列模型,特別是Seq2Seq架構。序列到序列模型,顧名思義,它的核心任務就是將一個序列映射到另一個序列。這個序列可以是文本,也可以是其他符號序列。最早,人們嘗試用一個單一的RNN來…

mac M2能安裝的虛擬機和linux系統系統

能適配MAC M2芯片的虛擬機下Linux系統的搭建全是深坑,目前網上的資料能搜到的都是錯誤的,自己整理并分享給坑友們~ 網上搜索到的推薦安裝的改造過的centos7也無法進行yum操作,我這邊建議安裝centos8 VMware Fusion下載地址: htt…

「國產嵌入式仿真平臺:高精度虛實融合如何終結Proteus時代?」——從教學實驗到低空經濟,揭秘新一代AI賦能的產業級教學工具

引言:從Proteus到國產平臺的范式革新 在高校嵌入式實驗教學中,仿真工具的選擇直接影響學生的工程能力培養與創新思維發展。長期以來,Proteus作為經典工具占據主導地位,但其設計理念已難以滿足現代復雜系統教學與國產化技術需求。…

【Linux】在Arm服務器源碼編譯onnxruntime-gpu的whl

服務器信息: aarch64架構 ubuntu20.04 nvidia T4卡 編譯onnxruntime-gpu前置條件: 已經安裝合適的cuda已經安裝合適的cudnn已經安裝合適的cmake 源碼編譯onnxruntime-gpu的步驟 1. 下載源碼 git clone --recursive https://github.com/microsoft/o…

前端上傳el-upload、原生input本地文件pdf格式(純前端預覽本地文件不走后端接口)

前端實現本地文件上傳與預覽(PDF格式展示)不走后端接口 實現步驟 第一步:文件選擇 使用前端原生input上傳本地文件,或者是el-upload組件實現文件選擇功能,核心在于文件渲染處理。(input只不過可以自定義樣…

Python 數據分析與可視化:開啟數據洞察之旅(5/10)

一、Python 數據分析與可視化簡介 在當今數字化時代,數據就像一座蘊藏無限價值的寶藏,等待著我們去挖掘和探索。而 Python,作為數據科學領域的明星語言,憑借其豐富的庫和強大的功能,成為了開啟這座寶藏的關鍵鑰匙&…

C語言學習記錄——深入理解指針(4)

OK,這一篇主要是講我學習的3種指針類型。 正文開始: 一.字符指針 所謂字符指針,顧名思義就是指向字符的指針。一般寫作 " char* " 直接來說說它的使用方法吧: (1)一般使用情況: i…

springboot3+vue3融合項目實戰-大事件文章管理系統獲取用戶詳細信息-ThreadLocal優化

一句話本質 為每個線程創建獨立的變量副本,實現多線程環境下數據的安全隔離(線程操作自己的副本,互不影響)。 關鍵解讀: 核心機制 ? 同一個 ThreadLocal 對象(如示意圖中的紅色區域 tl)被多個線…

Nacos源碼—8.Nacos升級gRPC分析六

大綱 7.服務端對服務實例進行健康檢查 8.服務下線如何注銷注冊表和客戶端等信息 9.事件驅動架構源碼分析 一.處理ClientChangedEvent事件 也就是同步數據到集群節點: public class DistroClientDataProcessor extends SmartSubscriber implements DistroDataSt…

設計雜談-工廠模式

“工廠”模式在各種框架中非常常見,包括 MyBatis,它是一種創建對象的設計模式。使用工廠模式有很多好處,尤其是在復雜的框架中,它可以帶來更好的靈活性、可維護性和可配置性。 讓我們以 MyBatis 為例,來理解工廠模式及…

AI與IoT攜手,精準農業未來已來

AIoT:農業領域的變革先鋒 在科技飛速發展的當下,人工智能(AI)與物聯網(IoT)的融合 ——AIoT,正逐漸成為推動各行業變革的關鍵力量,農業領域也不例外。AIoT 技術通過將 AI 的智能分析…