【第22節(jié)】直方圖反投影
目標(biāo)
????????本節(jié)我們將要學(xué)習(xí)直方圖反向投影
原理
????????直方圖反向投影是由Michael J. Swain和Dana H. Ballard在他們的文章"Indexing via color histograms"中提出。那它到底是什么呢?它可以用來做圖像分割,或者在圖像中找尋我們感興趣的部分。簡單來說,它會(huì)輸出與輸入圖像(待搜索)同樣大小的圖像,其中的每一個(gè)像素值代表了輸入圖像上對應(yīng)點(diǎn)屬于目標(biāo)對象的概率。用更簡單的話來解釋,輸出圖像中像素值越高(越白)的點(diǎn)就越可能代表我們要搜索的目標(biāo)(在輸入圖像所在的位置)。這是一個(gè)直觀的解釋。直方圖投影經(jīng)常與camshift算法等一起使用。
????????我們應(yīng)該怎樣來實(shí)現(xiàn)這個(gè)算法呢?首先我們要為一張包含我們要查找目標(biāo)的圖像創(chuàng)建直方圖(在我們的示例中,我們要查找的是藍(lán)色圓圈,其他的都不要)。 .我們要查找的對象要盡量占滿這張圖像(換句話說,這張圖像上最好是有且僅有我們要查找的對象)。最好使用顏色直方圖,因?yàn)橐粋€(gè)物體的顏色要比它的灰度能更好的被用來進(jìn)行圖像分割與對象識(shí)別。接著我們再把這個(gè)顏色直方圖投影到輸入圖像中尋找我們的目標(biāo),也就是找到輸入圖像中的每一個(gè)像素點(diǎn)的像素值在直方圖中對應(yīng)的概率,這樣我們就得到一個(gè)概率圖像,最后設(shè)置適當(dāng)?shù)拈撝祵Ω怕蕡D像進(jìn)行二值化,就這么簡單。
1、Numpy中的算法
????????此處的算法與上邊介紹的算法稍微不同。
????????首先,我們要?jiǎng)?chuàng)建兩幅顏色直方圖,目標(biāo)圖像的直方圖('M')(待搜索),輸入圖像的直方圖('I')。
????????計(jì)算比值:R=M/I。反向投影R,也就是根據(jù)R這個(gè)”調(diào)色板“創(chuàng)建一副新的圖像,其中的每一個(gè)像素代表這個(gè)點(diǎn)就是目標(biāo)的概率。例如B(x,y) =R[h(x,y),s(x,y)],其中h為點(diǎn)(x, y)處的hue值,s為點(diǎn)(x, y)處的saturation值。最后加入再一個(gè)條件 B (x,y) = min [B (x,y),1]。
????????現(xiàn)在使用一個(gè)圓盤算子做卷積,B = D?× B,其中D為卷積核。
????????現(xiàn)在輸出圖像中灰度值最大的地方就是我們要查找的目標(biāo)的位置了。如果我們要找的是一個(gè)區(qū)域,我們就可以使用一個(gè)閾值對圖像進(jìn)行二值化,這樣就可以得到一個(gè)很好的結(jié)果了。
2、OpenCV中反向投影
????? ?OpenCV提供的函數(shù)CV2.calcBackProject() 可以用來做直方圖反向投影。它的參數(shù)與函數(shù)CV2.calcHist的參數(shù)基本相同。其中的一個(gè)參數(shù)是我們要查找目標(biāo)的直方圖。同樣再使用目標(biāo)的直方圖做反向投影之前我們應(yīng)該先對其做歸一化處理。返回的結(jié)果是-個(gè)概率圖像,我們再使用一個(gè)圓盤形卷積核對其做卷操作,最后使用閾值進(jìn)行二值化。下面就是代碼和結(jié)果:
下面是我是用的一幅圖像,我是用藍(lán)色小球作為取樣對象,在根據(jù)這個(gè)樣本搜索圖中所有的類似區(qū)域。
