Python-OpenCV中的圖像處理-圖像金字塔

Python-OpenCV中的圖像處理-圖像金字塔

  • 圖像金字塔
    • 高斯金字塔
    • 拉普拉斯金字塔
  • 金字塔圖像融合

圖像金字塔

  • 同一圖像的不同分辨率的子圖集合,如果把最大的圖像放在底部,最小的放在頂部,看起來像一座金字塔,故而得名圖像金字塔。
  • cv2.pyrUp():上采樣
  • cv2.pyrDown():下采樣
    在這里插入圖片描述

高斯金字塔

高斯金字塔的頂部是通過將底部圖像中的連續的行和列去除得到的。頂部圖像中的每個像素值等于下一層圖像中 5 個像素的高斯加權平均值。這樣操作一次一個 MxN 的圖像就變成了一個 M/2xN/2 的圖像。所以這幅圖像的面積就變為原來圖像面積的四分之一。這被稱為 Octave。連續進行這樣的操作我們就會得到一個分辨率不斷下降的圖像金字塔。我們可以使用函數cv2.pyrDown() 和 cv2.pyrUp() 構建圖像金字塔。

import numpy as np
import cv2
from matplotlib import pyplot as plt# 圖像金字塔 :同一圖像的不同分辨率的子圖集合
# 有兩種:高斯金字塔(Gaussian Pyramid) 和 拉普拉斯金字塔(Pyramid)
# 高斯金字塔 每次處理后圖像的面積變為原來的四分之一,也被稱為Octave
# cv2.pyrDown() #分辨率降低
# cv2.pyrUp()   #分辨率增高img = cv2.imread('./resource/opencv/image/messi5.jpg')
lower_reso = cv2.pyrDown(img)
lower_reso2 = cv2.pyrDown(lower_reso)upper_reso = cv2.pyrUp(lower_reso2)
upper_reso2 = cv2.pyrUp(upper_reso)cv2.imshow('img', img)
cv2.imshow('lower_reso', lower_reso)
cv2.imshow('lower_reso2', lower_reso2)
cv2.imshow('upper_reso', upper_reso)
cv2.imshow('upper_reso2', upper_reso2)
cv2.waitKey(0)
cv2.destroyAllWindows()

在這里插入圖片描述

拉普拉斯金字塔

拉普拉斯金字塔可以有高斯金字塔計算得來,公式如下:
Li = Gi - pyrUp( Gi + 1 )
式中:

  • Li:表示拉普拉斯金字塔中的第i層
  • Gi:表示高斯金字塔中的第i層
    拉普拉金字塔的圖像看起來就像邊界圖,其中很多像素都是 0。他們經常
    被用在圖像壓縮中。

在這里插入圖片描述
圖中各標記含義如下:

  • 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都可以通過拉普拉斯金字塔的構造表達式得到。如之前介紹的,拉普拉斯金字塔的目的就是為了恢復高分辨率的圖像。

# 拉普拉斯金字塔構建
G0 = cv2.imread("./resource/opencv/image/lena.jpg")
cv2.imshow("input image",G0)
G1=cv2.pyrDown(G0)
G2=cv2.pyrDown(G1)
G3=cv2.pyrDown(G2)
G4=cv2.pyrDown(G3)
L0 = cv2.subtract(G0,cv2.pyrUp(G1))
L1 = cv2.subtract(G1,cv2.pyrUp(G2))
L2 = cv2.subtract(G2,cv2.pyrUp(G3))
L3 = cv2.subtract(G3,cv2.pyrUp(G4))
cv2.imshow("G1",G1)
cv2.imshow("G2",G2)
cv2.imshow("G3",G3)
cv2.imshow("G4",G4)
cv2.waitKey(0)
cv2.destroyAllWindows()
import numpy as np
import cv2# 拉普拉斯金字塔是由高斯金字塔計數得到,公式如下
# Li = Gi - PyrUP(PyrDown(Gi))# 拉普拉斯金字塔圖像看起來像是邊界圖,其中很多像素都是0,常被用在圖像壓縮中。import cv2 as cvif __name__ == '__main__':img = cv.imread("./resource/opencv/image/lena.jpg")down1 = cv.pyrDown(img)res = img - cv.pyrUp(down1)down2 = cv.pyrDown(down1)res2 = down1 - cv.pyrUp(down2)cv.imshow("img", img)cv.imshow("res", res)cv.imshow("res2", res2)cv.waitKey(0)cv.destroyAllWindows()

在這里插入圖片描述

金字塔圖像融合

import numpy as np
import cv2
import sys# 實現上述效果的步驟如下:
# 1. 讀入兩幅圖像,蘋果和橘子
# 2. 構建蘋果和橘子的高斯金字塔( 6 層)
# 3. 根據高斯金字塔計算拉普拉斯金字塔
# 4. 在拉普拉斯的每一層進行圖像融合(蘋果的左邊與橘子的右邊融合)
# 5. 根據融合后的圖像金字塔重建原始圖像。A = cv2.imread('./resource/opencv/image/apple.jpg')
B = cv2.imread('./resource/opencv/image/orange.jpg')
print(A.shape)
print(B.shape)
# 生成高斯金字塔
G = A.copy()
gpA = [G]
for i in range(5):G = cv2.pyrDown(G)gpA.append(G)G = B.copy()
gpB = [G]
for i in range(5):G = cv2.pyrDown(G)gpB.append(G)
# 產生Laplacian金字塔
lpA = [gpA[5]]
for i in range(5,0,-1):GE = cv2.pyrUp(gpA[i])L = cv2.subtract(gpA[i-1],GE)lpA.append(L)lpB = [gpB[5]]
for i in range(5,0,-1):GE = cv2.pyrUp(gpB[i])L = cv2.subtract(gpB[i-1],GE)lpB.append(L)
# 合并
LS = []
for la,lb in zip(lpA,lpB):rows,cols,dpt = la.shapels = np.hstack((la[:,0:cols//2], lb[:,cols//2:]))LS.append(ls)
# 重新構建圖像
ls_ = LS[0]
for i in range(1,6):ls_ = cv2.pyrUp(ls_)ls_ = cv2.add(ls_, LS[i])
# 連接
real = np.hstack((A[:,:cols//2],B[:,cols//2:]))
cv2.imshow("apple",A)
cv2.imshow("orange",B)
cv2.imshow("LS",ls_)
cv2.imshow("Real",real)
cv2.waitKey()
cv2.destroyAllWindows()

在這里插入圖片描述

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

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

相關文章

小程序發布注意事項

1、使用HBuildx的 發布 功能發布小程序,因為編譯完的代碼目錄不是同一個 如果使用 運行 到小程序,最后發布的版本會顯示”無法連接本地服務器“ 2、使用unicloud的云服務 uniCloud發行 | uni-app官網 阿里云的unicloud的話,使用request域名…

Spring中Bean的循環依賴問題

1.什么是Bean的循環依賴? 簡單來說就是在A類中,初始化A時需要用到B對象,而在B類中,初始化B時需要用到A對象,這種狀況下在Spring中,如果A和B同時初始化,A,B同時都需要對方的資源&…

電腦開機出現Boot Device怎么辦?

開機出現Boot Device這個問題很常見,有時還會出現No Boot Device的問題,雖然多了一個單詞,但意思是相同的,這些問題說明你的系統盤出現了問題,或者是引導出現了問題。這該如何解決呢? 方法1. 檢查主板或硬盤…

【算法——雙指針】LeetCode 283 移動零

題目描述: 思路: (雙指針) O(n)O(n)O(n) 給定一個數組 nums,要求我們將所有的 0 移動到數組的末尾,同時保持非零元素的相對順序。 如圖所示,數組nums [0,1,0,3,12],移動完成后變成nums [1,3,12,0,0] &am…

若依vue -【 100 ~ 更 ~ 110 】

100 主子表代碼生成詳解 1 新建數據庫表結構(主子表) -- ---------------------------- -- 客戶表 -- ---------------------------- drop table if exists sys_customer; create table sys_customer (customer_id bigint(20) not null…

Docker部署rabbitmq遇到的問題 Stats in management UI are disabled on this node

1. Stats in management UI are disabled on this node #進入rabbitmq容器 docker exec -it {rabbitmq容器名稱或者id} /bin/bash#進入容器后,cd到以下路徑 cd /etc/rabbitmq/conf.d/#修改 management_agent.disable_metrics_collector false echo management_age…

談談語音助手

目錄 1.什么是語音助手 2.語音助手的發展過程 3.現在有哪些成熟的語音助手 4.語音助手對人類發展的影響 1.什么是語音助手 語音助手是一種能夠通過語音交互與用戶進行溝通和執行任務的虛擬助手。它基于人工智能和自然語言處理技術,能夠理解用戶的語音指令&#x…

數據結構-隊列的實現(C語言版)

前言 隊列是一種特殊的線性表,它只允許在一端對數據進行插入操作,在另一端對數據進行刪除操作的特殊線性表,隊列具有先進先出的(FIFO)的 特性,進行插入操作的一端稱為隊尾,進行刪除操作的一端稱…

JZ37序列化二叉樹

題目地址:序列化二叉樹_牛客題霸_牛客網 題目回顧: 解題思路: 首先,序列化就是將二叉樹的節點值放入一個字符串中,這里可以按照前序遍歷的思路來進行操作,謙虛遍歷是:根左右的情況,…

什么是React?React與VU的優缺點有哪些?

什么是React?什么是VUE? 維基百科上的概念解釋,Vue.js是一個用于創建用戶界面的開源MVVM前端JavaScript框架,也是一個創建單頁應用的Web應用框架。Vue.js由尤雨溪(Evan You)創建,由他和其他活躍…

Cmd部署HexoGithub443問題

git config --global http.proxy “localhost:7890” 配置下代理即可 本文由 mdnice 多平臺發布

微信小程序 地圖map(電子圍欄圓形和多邊形)

正常情況下是沒有手機上畫電子圍欄的,公共平臺上我也沒找到,所以走了一個歪點子,就是給地圖添加點擊事件,記錄點的位置,在畫到電子圍欄上就是添加電子圍欄了,如果只是顯示電子圍欄就簡單了 一、多邊形電子…

2023.8.12號論文閱讀

文章目錄 TriFormer: A Multi-modal Transformer Framework For Mild Cognitive Impairment Conversion Prediction摘要本文方法實驗結果 SwIPE: Efficient and Robust Medical Image Segmentation with Implicit Patch Embeddings摘要本文方法實驗結果 TriFormer: A Multi-mod…

macos搭建python3虛擬環境

我們知道macos自帶的python版本是Python2.7, 這個版本比較老而且往往和我們的工程不兼容,所以就得需要我們升級Python版本, 我們不建議直接升級macos自帶的本地Python2.7, 因為macos有一些基礎軟件是依賴于Python2.7的,如果動了遇到問題想再…

日志框架及其使用方法

log4j和logBack,同一個人寫的,logBack為log4j的升級版,SpringBoot中默認集成logBack 作用:記錄軟件發布后的一些bug,以及數據是怎樣被操作的 傳統開發弊端: 1.日志直接輸出在控制臺,關閉控制臺后,日志消…

Netty:在一個ByteBuf中尋找另外一個ByteBuf出現的位置

說明 利用ByteBufUtil的indexOf(ByteBuf needle, ByteBuf haystack)函數可以在haystack中尋找needle出現的位置。如果沒有找到,返回-1。 示例 在一個ByteBuf 中找到了另外一個ByteBuf package com.thb;import io.netty.buffer.ByteBuf; import io.netty.buffer.…

Linux: network: tools: tcpdump,抓取vlan包需要注意的事情;不然會出現LLC協議

https://bugzilla.redhat.com/show_bug.cgi?id498981#c4 https://serverfault.com/questions/544651/vlan-tags-not-shown-in-packet-capture-linux-via-tcpdump 如果不加-e參數,抓取不到 vlan信息,會導致wireshark解析出現問題。因為,抓到…

AirServer是什么軟件,手機屏幕投屏電腦神器

什么是 AirServer? AirServer 是適用于 Mac 和 PC 的先進的屏幕鏡像接收器。 它允許您接收 AirPlay 和 Google Cast 流,類似于 Apple TV 或 Chromecast 設備。AirServer 可以將一個簡單的大屏幕或投影儀變成一個通用的屏幕鏡像接收器 ,是一款…

PDF Expert 3.3 for mac

PDF Expert是一款專業的PDF編輯和閱讀工具。它可以幫助用戶在Mac、iPad和iPhone等設備上查看、注釋、編輯、填寫和簽署PDF文檔。 以下是PDF Expert的特點: PDF編輯:PDF Expert提供了豐富的PDF編輯功能,包括添加、刪除、移動、旋轉、縮放、裁…

《貧窮的本質》閱讀筆記

《貧窮的本質》閱讀筆記 2023年8月11日在杭州小屋讀完,對于窮,我可有太多想說的了。可以說自己活這么大以來,一直在擺脫貧窮,也將會窮盡一生去避免貧窮。作為一個窮人該如何去擺脫貧窮,我覺得沒有一個確切的答案&#…