這是對于 OpenCV 官方文檔中 圖像處理 的學(xué)習(xí)筆記。學(xué)習(xí)筆記中會(huì)記錄官方給出的例子,也會(huì)給出自己根據(jù)官方的例子完成的更改代碼,同樣彩蛋的實(shí)現(xiàn)也會(huì)結(jié)合多個(gè)知識點(diǎn)一起實(shí)現(xiàn)一些小功能,來幫助我們對學(xué)會(huì)的知識點(diǎn)進(jìn)行結(jié)合應(yīng)用。
如果有喜歡我筆記的請麻煩幫我關(guān)注、點(diǎn)贊、評論。謝謝諸位。
學(xué)習(xí)筆記:
學(xué)習(xí)筆記目錄里面會(huì)收錄我關(guān)于OpenCV系列學(xué)習(xí)筆記博文,大家如果有什么不懂的可以通過閱讀我的學(xué)習(xí)筆記進(jìn)行學(xué)習(xí)。
【OpenCV學(xué)習(xí)筆記】- 學(xué)習(xí)筆記目錄
內(nèi)容
- 直方圖反投影
理論
它是由 Michael J. Swain 和 Dana H. Ballard 在他們的論文 “ 通過顏色直方圖索引” 中提出的。
簡單來說到底是什么?它用于圖像分割或在圖像中查找感興趣的對象。簡而言之,它創(chuàng)建的圖像大小與輸入圖像相同(但只有一個(gè)通道),其中每個(gè)像素對應(yīng)于該像素屬于我們物體的概率。在更簡單的環(huán)境中,與其余部分相比,輸出圖像將使我們感興趣的對象具有更多的白色。好吧,這是一個(gè)直觀的解釋。(我無法使其更簡單)。直方圖反投影與camshift算法等配合使用。
我們該怎么做呢 ?我們創(chuàng)建一個(gè)圖像的直方圖,其中包含我們感興趣的對象(在我們的示例中是地面,離開播放器等)。對象應(yīng)盡可能填充圖像以獲得更好的效果。而且顏色直方圖比灰度直方圖更可取,因?yàn)閷ο蟮念伾绕浠叶葟?qiáng)度是定義對象的更好方法。然后,我們將該直方圖“反向投影”到需要找到對象的測試圖像上,換句話說,我們計(jì)算出屬于地面的每個(gè)像素的概率并將其顯示出來。在適當(dāng)?shù)拈撝迪庐a(chǎn)生的輸出僅使我們有基礎(chǔ)。
Numpy中的算法
1. 首先,我們需要計(jì)算我們要查找的對象(使其為“ M”)和要搜索的圖像(使其為“ I”)的顏色直方圖。
示例代碼:
# OpenCV 中的直方圖
# 直方圖 - 4:直方圖反投影
# Numpy中的反投影算法
import numpy as np
import cv2 as cv
# roi is the object or region of object we need to find
# ROI是我們需要找到的對象或?qū)ο蟮膮^(qū)域
roi = cv.imread('../image/3.10.3-1.png')
hsv = cv.cvtColor(roi, cv.COLOR_BGR2HSV)
# target is the image we search in
# 目標(biāo)是我們搜索的圖像
target = cv.imread('../image/3.10.3-1.png')
hsvt = cv.cvtColor(target, cv.COLOR_BGR2HSV)
# Find the histograms using calcHist. Can be done with np.histogram2d also
# 使用calcHist查找直方圖??梢杂胣p來完成。histogram2d也
M = cv.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])
I = cv.calcHist([hsvt], [0, 1], None, [180, 256], [0, 180, 0, 256])
2. 求出比率 (R= M/I)。然后反向投影R,即使用R作為調(diào)色板,并以每個(gè)像素作為其對應(yīng)的目標(biāo)概率創(chuàng)建一個(gè)新圖像。即 (B(x,y)= R [h(x,y),s(x,y)]) 其中h是色調(diào),s是像素在(x,y)的飽和度。之后,應(yīng)用條件 (B(x,y)= min[B(x,y),1]) 。
h,s,v = cv.split(hsvt)
B = R[h.ravel(),s.ravel()]
B = np.minimum(B,1)
B = B.reshape(hsvt.shape[:2])
3.現(xiàn)在對圓盤應(yīng)用卷積,(B=D?B) ,其中D是光盤內(nèi)核。
disc = cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))
cv.filter2D(B,-1,disc,B)
B = np.uint8(B)
cv.normalize(B,B,0,255,cv.NORM_MINMAX)
4.現(xiàn)在最大強(qiáng)度的位置給了我們物體的位置。如果我們期望圖像中有一個(gè)區(qū)域,則對合適的值進(jìn)行閾值處理將獲得不錯(cuò)的結(jié)果。
ret,thresh = cv.threshold(B,50,255,0)
OpenCV中的反投影
OpenCV提供了一個(gè)內(nèi)置函數(shù) cv.calcBackProject() 。它的參數(shù)與 cv.calcHist() 函數(shù)幾乎相同。它的參數(shù)之一是直方圖,它是對象的直方圖,我們必須找到它。另外,在傳遞給backproject函數(shù)之前,應(yīng)對對象直方圖進(jìn)行標(biāo)準(zhǔn)化。它返回概率圖像。然后,我們將圖像與磁盤內(nèi)核卷積并應(yīng)用閾值。
示例代碼:
ret,thresh = cv.threshold(B,50,255,0)
原圖:
區(qū)域圖:
效果圖:文章來源:http://www.zghlxwxcb.cn/news/detail-843581.html
其他資源
“Indexing via color histograms”(“基于顏色直方圖的索引”),Swain, Michael J.,第三屆計(jì)算機(jī)視覺國際會(huì)議,1990。文章來源地址http://www.zghlxwxcb.cn/news/detail-843581.html
到了這里,關(guān)于【OpenCV學(xué)習(xí)筆記30】- OpenCV 中的直方圖 - 直方圖 - 4:直方圖反投影的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!