python?OpenCV影像金字塔實例分析
May 11, 2023 pm 08:40 PM1.圖像金字塔理論基礎
圖像金字塔是圖像多尺度表達的一種,是一種以多分辨率來解釋圖像的有效但概念簡單的結(jié)構(gòu)。一幅圖像的金字塔是一系列以金字塔形狀排列的分辨率逐步降低,且來源于同一張原始圖的圖像集合。其通過梯次向下采樣獲得,直到達到某個終止條件才停止采樣。我們將一層一層的圖像比喻成金字塔,層級越高,則圖像越小,分辨率越低。
那我們?yōu)槭裁匆鰣D像金字塔呢?這就是因為改變像素大小有時候并不會改變它的特征,比方說給你看1000萬像素的圖片,你能知道里面有個人,給你看十萬像素的,你也能知道里面有個人,但是對計算機而言,處理十萬像素可比處理1000萬像素要容易太多了。就是為了讓計算機識別特征這個事變得更加簡便,后期我們也會講到識別特征這個實戰(zhàn)項目,大概就是說比如你在高中打籃球,遠遠的看見你班主任出來了,你們離500米,你依然可以根據(jù)特征取認識出來你的老師,和你班主任離你2米的時候一樣。
也就是說圖像金字塔式同一個圖像不同分辨率子圖的集合。在這里我們可以舉一個例子就是原始圖像是一個400400的圖像,那么向上取就可以是200200的一張圖像然后100*100,這樣分辨率降低,但是始終是同一個圖像。
那么從第i層到第i+1層,他具體是怎么做的呢?
1.計算輸入圖像減少的分辨率的近似值。這可以通過對輸入進行濾波并以2為步長進行抽樣(即子抽樣)??梢圆捎玫臑V波操作有很多,如鄰域平均(可生成平均值金字塔),高斯低通濾波器(可生成高斯金字塔),或者不進行濾波,生成子抽樣金字塔。生成近似值的質(zhì)量是所選濾波器的函數(shù)。沒有濾波器,在金字塔的上一層中的混淆變得很顯著,子抽樣點對所選取的區(qū)域沒有很好的代表性。
2.對上一步的輸出進行內(nèi)插(因子仍為2)并進行過濾。這將生成與輸入等分辨率的預測圖像。由于在步驟1的輸出像素之間進行插值運算,所以插入濾波器決定了預測值與步驟1的輸入之間的近似程度。如果插入濾波器被忽略了,則預測值將是步驟1輸出的內(nèi)插形式,復制像素的塊效應將變得很明顯。
3.計算步驟2的預測值和步驟1的輸入之間的差異。以j級預測殘差進行標識的這個差異將用于原始圖像的重建。在沒有量化差異的情況下,預測殘差金字塔可以用于生成相應的近似金字塔(包括原始圖像),而沒有誤差。
執(zhí)行上述過程P次將產(chǎn)生密切相關的P+1級近似值和預測殘差金字塔。j-1級近似值的輸出用于提供近似值金字塔,而j級預測殘差的輸出放在預測殘差金字塔中。如果不需要預測殘差金字塔,則步驟2和3、內(nèi)插器、插入濾波器以及圖中的加法器都可以省略。
這里面下取樣表示圖像的縮小。向上取樣表示的是圖像的增大。
1.對圖像Gi進行高斯核卷積。
高斯核卷積就是我們所說的高斯濾波操縱,我們之前就已經(jīng)講過,使用一個高斯卷積核,讓臨近的像素值所占的權(quán)重較大,然后和目標圖像做相關操作。
2.刪除所有的偶數(shù)行和列。
原始圖像 M * N 處理結(jié)果 M/2 * N/2。每次處理后,結(jié)果圖像是原來的1/4。這個操作被稱為Octave。重復執(zhí)行該過程,構(gòu)造圖像金字塔。直至圖像不能繼續(xù)下分為止。這個過程會丟失圖像信息。
而向上取樣恰恰和向下取樣相反,是在原始圖像上,**在每個方向上擴大為原來的2倍,新增的行和列以0填充。使用與“向下采用”同樣的卷積核乘以4,獲取“新增像素”的新值。**經(jīng)過向上取樣后的圖像會模糊。
向上采樣、向下采樣不是互逆操作。經(jīng)過兩種操作后,無法恢復原有圖像。
2.向下取樣函數(shù)及使用
圖像金字塔向下取樣函數(shù):
dst=cv2.pyrDown(src)
import cv2 import numpy as np o=cv2.imread("image\\man.bmp") r1=cv2.pyrDown(o) r2=cv2.pyrDown(r1) r3=cv2.pyrDown(r2) cv2.imshow("original",o) cv2.imshow("PyrDown1",r1) cv2.imshow("PyrDown2",r2) cv2.imshow("PyrDown3",r3) cv2.waitKey() cv2.destroyAllWindows()
這里我們對圖像做三次向下取樣,結(jié)果為:
向下取樣會丟失信息?。?!
3.向上取樣函數(shù)及使用
圖像金字塔向上取樣函數(shù):
dst=cv2.pyrUp(src)
這里代碼我們就不做介紹了。
直接看一下我們的結(jié)果:
4.采樣可逆性研究
這里我們具體看一下圖像進行向下取樣然后進行向上取樣操作后,是不是一致的。還有就是圖像進行向上取樣然后向下取樣后,是不是一致的呢?這里我們以小女孩的圖像做一下研究。
首先我們來分析一下:當圖像做向下取樣一次之后,圖像由MN變成了M/2N/2,然后再次經(jīng)過向上取樣之后又變成了M*N。那么可以證明對于圖片的size是不發(fā)生變化的。
import cv2 o=cv2.imread("image\\girl.bmp") down=cv2.pyrDown(o) up=cv2.pyrUp(down) cv2.imshow("original",o) cv2.imshow("down",down) cv2.imshow("up",up) cv2.waitKey() cv2.destroyAllWindows()
那么我們來看一下到底發(fā)生了什么變化呢?
這里可以很清晰的看出來小女孩的照片變得模糊了,那么是為什么呢?因為我們上面說到了就是當圖像變小的時候,那么就會損失一些信息,再次放大之后,由于卷積核變大了,那么圖像會變模糊。所以不會和原始圖像保持一致。
然后我們再來看一下先進行向上取樣操作,然后進行向下取樣操作會是什么樣子呢?由于圖像變大太大所以我們省去中間圖像向上取樣的圖片。
那么我們用肉眼也不是特別容易發(fā)現(xiàn)差異,那么我們用圖像減法去看一下。
import cv2 o=cv2.imread("image\\girl.bmp") up=cv2.pyrUp(o) down=cv2.pyrDown(up) diff=down-o #構(gòu)造diff圖像,查看down與o的區(qū)別 cv2.imshow("difference",diff) cv2.waitKey() cv2.destroyAllWindows()
5.拉普拉斯金字塔
我們先來看一下拉普拉斯金字塔是一個什么東西:
Li = Gi - PyrUp(PyrDown(Gi))
我們根據(jù)他這個式子可以知道,拉普拉斯金字塔就是使用原始圖像減去圖像向下取樣然后向上取樣的這樣一個過程。
展示在圖像當中就是:
核心函數(shù)就是:
od=cv2.pyrDown(o) odu=cv2.pyrUp(od) lapPyr=o-odu
6.圖像輪廓介紹
首先我們先要說明這樣一個事情就是彼圖像輪廓和圖像的邊緣是不一樣的,邊緣是零零散散的,但是輪廓是一個整體。
邊緣檢測能夠測出邊緣,但是邊緣是不連續(xù)的。將邊緣連接為一個整體,構(gòu)成輪廓。
注意:
對象是二值圖像。所以需要預先進行閾值分割或者邊緣檢測處理。查找輪廓需要更改原始圖像。因此,通常使用原始圖像的一份拷貝操作。在OpenCV中,是從黑色背景中查找白色對象。因此,對象必須是白色的,背景必須是黑色的。
對于圖像輪廓的檢測需要的函數(shù)是:
cv2.findContours( )和cv2.drawContours( )
查找圖像輪廓的函數(shù)是cv2.findContours(),通過cv2.drawContours()將查找到的輪廓繪制到圖像上。
對于cv2.findContours( )函數(shù):
image, contours, hierarchy = cv2.findContours( image, mode, method)
這里需要注意在最新的版本中,查找輪廓中的返回函數(shù)只有兩個即可:
contours, hierarchy = cv2.findContours( image, mode, method)
contours ,輪廓
hierarchy ,圖像的拓撲信息(輪廓層次)
image ,原始圖像
mode ,輪廓檢索模式
method ,輪廓的近似方法
這里我們需要介紹mode:也就是輪廓檢索模式:
cv2.RETR_EXTERNAL :表示只檢測外輪廓
cv2.RETR_LIST :檢測的輪廓不建立等級關系
cv2.RETR_CCOMP :建立兩個等級的輪廓,上面的一層為外邊界,里面的一層為內(nèi)孔的邊 界信息。如果內(nèi)孔內(nèi)還有一
個連通物體,這個物體的邊界也在頂層
cv2.RETR_TREE :建立一個等級樹結(jié)構(gòu)的輪廓。
然后我們介紹一下method ,輪廓的近似方法:
cv2.CHAIN_APPROX_NONE :存儲所有的輪廓點,相鄰的兩個點的像素位置差不超過1, 即max(abs(x1-x2),abs(y2-y1))==1
cv2.CHAIN_APPROX_SIMPLE:壓縮水平方向,垂直方向,對角線方向的元素, 只保留該方向的終點坐標,例如一個矩形輪廓只需4個點來保存輪廓信息
cv2.CHAIN_APPROX_TC89_L1:使用teh-Chinl chain 近似算法
cv2.CHAIN_APPROX_TC89_KCOS:使用teh-Chinl chain 近似算法
比如對一個矩形做輪廓檢測,使用cv2.CHAIN_APPROX_NONE和cv2.CHAIN_APPROX_SIMPLE得結(jié)果是這樣:
可以看出后者省出來很多計算空間。
對于cv2.drawContours( ):
r=cv2.drawContours(o, contours, contourIdx, color[, thickness])
r :目標圖像,直接修改目標的像素點,實現(xiàn)繪制。
o :原始圖像
contours :需要繪制的邊緣數(shù)組。
contourIdx :需要繪制的邊緣索引,如果全部繪制則為 -1。
color :繪制的顏色,為 BGR 格式的 Scalar 。
thickness :可選,繪制的密度,即描繪輪廓時所用的畫筆粗細。
import cv2 import numpy as np o = cv2.imread('image\\boyun.png') gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY) ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY) image,contours, hierarchy =cv2.findContours(binary,cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) co=o.copy() r=cv2.drawContours(co,contours,-1,(0,0,255),1) cv2.imshow("original",o) cv2.imshow("result",r) cv2.waitKey() cv2.destroyAllWindows()
對于多個輪廓,我們也可以指定畫哪一個輪廓。
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY) ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY) image,contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) co=o.copy() r=cv2.drawContours(co,contours,0,(0,0,255),6)
如果設置成-1,那么就是全部顯示?。。?/p>
輪廓近似
當輪廓有毛刺的時候,我們希望能夠做輪廓近似,將毛刺去掉,大體思想是將曲線用直線代替,但是有個長度的閾值需要自己設定。
我們還可以做額外的操作,比如外接矩形,外接圓,外界橢圓等等。
img = cv2.imread('contours.png') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) cnt = contours[0] x,y,w,h = cv2.boundingRect(cnt) img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2) cv_show(img,'img') area = cv2.contourArea(cnt) x, y, w, h = cv2.boundingRect(cnt) rect_area = w * h extent = float(area) / rect_area print ('輪廓面積與邊界矩形比',extent) 外接圓 (x,y),radius = cv2.minEnclosingCircle(cnt) center = (int(x),int(y)) radius = int(radius) img = cv2.circle(img,center,radius,(0,255,0),2) cv_show(img,'img')
模板匹配和卷積原理很像,模板在原圖像上從原點開始滑動,計算模板與(圖像被模板覆蓋的地方)的差別程度,這個差別程度的計算方法在opencv里有六種,然后將每次計算的結(jié)果放入一個矩陣里,作為結(jié)果輸出。假如原圖形是AXB大小,而模板是axb大小,則輸出結(jié)果的矩陣是(A-a+1)x(B-b+1)。
TM_SQDIFF:計算平方不同,計算出來的值越小,越相關
TM_CCORR:計算相關性,計算出來的值越大,越相關
TM_CCOEFF:計算相關系數(shù),計算出來的值越大,越相關
TM_SQDIFF_NORMED:計算歸一化平方不同,計算出來的值越接近0,越相關
TM_CCORR_NORMED:計算歸一化相關性,計算出來的值越接近1,越相關
TM_CCOEFF_NORMED:計算歸一化相關系數(shù),計算出來的值越接近1,越相關
以上是python?OpenCV影像金字塔實例分析的詳細內(nèi)容。更多資訊請關注PHP中文網(wǎng)其他相關文章!

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動的應用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

用戶語音輸入通過前端JavaScript的MediaRecorderAPI捕獲並發(fā)送至PHP後端;2.PHP將音頻保存為臨時文件後調(diào)用STTAPI(如Google或百度語音識別)轉(zhuǎn)換為文本;3.PHP將文本發(fā)送至AI服務(如OpenAIGPT)獲取智能回復;4.PHP再調(diào)用TTSAPI(如百度或Google語音合成)將回復轉(zhuǎn)為語音文件;5.PHP將語音文件流式返回前端播放,完成交互。整個流程由PHP主導數(shù)據(jù)流轉(zhuǎn)與錯誤處理,確保各環(huán)節(jié)無縫銜接。

要實現(xiàn)PHP結(jié)合AI進行文本糾錯與語法優(yōu)化,需按以下步驟操作:1.選擇適合的AI模型或API,如百度、騰訊API或開源NLP庫;2.通過PHP的curl或Guzzle調(diào)用API並處理返回結(jié)果;3.在應用中展示糾錯信息並允許用戶選擇是否採納;4.使用php-l和PHP_CodeSniffer進行語法檢測與代碼優(yōu)化;5.持續(xù)收集反饋並更新模型或規(guī)則以提升效果。選擇AIAPI時應重點評估準確率、響應速度、價格及對PHP的支持。代碼優(yōu)化應遵循PSR規(guī)範、合理使用緩存、避免循環(huán)查詢、定期審查代碼,並藉助X

選擇合適的PHP框架需根據(jù)項目需求綜合考慮:Laravel適合快速開發(fā),提供EloquentORM和Blade模板引擎,便於數(shù)據(jù)庫操作和動態(tài)表單渲染;Symfony更靈活,適合複雜系統(tǒng);CodeIgniter輕量,適用於對性能要求較高的簡單應用。 2.確保AI模型準確性需從高質(zhì)量數(shù)據(jù)訓練、合理選擇評估指標(如準確率、召回率、F1值)、定期性能評估與模型調(diào)優(yōu)入手,並通過單元測試和集成測試保障代碼質(zhì)量,同時持續(xù)監(jiān)控輸入數(shù)據(jù)以防止數(shù)據(jù)漂移。 3.保護用戶隱私需採取多項措施:對敏感數(shù)據(jù)進行加密存儲(如AES

使用Seaborn的jointplot可快速可視化兩個變量間的關係及各自分佈;2.基礎散點圖通過sns.jointplot(data=tips,x="total_bill",y="tip",kind="scatter")實現(xiàn),中心為散點圖,上下和右側(cè)顯示直方圖;3.添加回歸線和密度信息可用kind="reg",並結(jié)合marginal_kws設置邊緣圖樣式;4.數(shù)據(jù)量大時推薦kind="hex",用

PHP結(jié)合AI做視頻內(nèi)容分析的核心思路是讓PHP作為后端“膠水”,先上傳視頻到云存儲,再調(diào)用AI服務(如GoogleCloudVideoAI等)進行異步分析;2.PHP解析返回的JSON結(jié)果,提取人物、物體、場景、語音等信息生成智能標簽并存入數(shù)據(jù)庫;3.優(yōu)勢在于利用PHP成熟的Web生態(tài)快速集成AI能力,適合已有PHP系統(tǒng)的項目高效落地;4.常見挑戰(zhàn)包括大文件處理(用預簽名URL直傳云存儲)、異步任務(引入消息隊列)、成本控制(按需分析 預算監(jiān)控)和結(jié)果優(yōu)化(標簽規(guī)范化);5.智能標簽顯著提升視

要將AI情感計算技術融入PHP應用,核心是利用雲(yún)服務AIAPI(如Google、AWS、Azure)進行情感分析,通過HTTP請求發(fā)送文本並解析返回的JSON結(jié)果,將情感數(shù)據(jù)存入數(shù)據(jù)庫,從而實現(xiàn)用戶反饋的自動化處理與數(shù)據(jù)洞察。具體步驟包括:1.選擇適合的AI情感分析API,綜合考慮準確性、成本、語言支持和集成複雜度;2.使用Guzzle或curl發(fā)送請求,存儲情感分數(shù)、標籤及強度等信息;3.構(gòu)建可視化儀錶盤,支持優(yōu)先級排序、趨勢分析、產(chǎn)品迭代方向和用戶細分;4.應對技術挑戰(zhàn),如API調(diào)用限制、數(shù)

PHP開發(fā)AI文本摘要的核心是作為協(xié)調(diào)器調(diào)用外部AI服務API(如OpenAI、HuggingFace),實現(xiàn)文本預處理、API請求、響應解析與結(jié)果展示;2.局限性在於計算性能弱、AI生態(tài)薄弱,應對策略為藉力API、服務解耦和異步處理;3.模型選擇需權(quán)衡摘要質(zhì)量、成本、延遲、並發(fā)、數(shù)據(jù)隱私,推薦使用GPT或BART/T5等抽象式模型;4.性能優(yōu)化包括緩存、異步隊列、批量處理和就近區(qū)域選擇,錯誤處理需覆蓋限流重試、網(wǎng)絡超時、密鑰安全、輸入驗證及日誌記錄,以確保系統(tǒng)穩(wěn)定高效運行。

字符串列表可用join()方法合併,如''.join(words)得到"HelloworldfromPython";2.數(shù)字列表需先用map(str,numbers)或[str(x)forxinnumbers]轉(zhuǎn)為字符串後才能join;3.任意類型列表可直接用str()轉(zhuǎn)換為帶括號和引號的字符串,適用於調(diào)試;4.自定義格式可用生成器表達式結(jié)合join()實現(xiàn),如'|'.join(f"[{item}]"foriteminitems)輸出"[a]|[
