关于抠图的一些文章方法收集
引言:
???????? 結合深度場景,提取支撐面,是一個漸進分割的好辦法。既然可以利用深度圖,那么便最大化利用深度圖像;
分割支撐面以后,可以利用摳圖算法,把RGB剩余的像素載進行摳圖:《"GrabCut" - Interactive Foreground Extraction using Iterated Graph Cuts》
GrabCut函數說明
void grabCut(InputArrayimg, InputOutputArray mask, Rect rect, InputOutputArraybgdModel, InputOutputArrayfgdModel, intiterCount, intmode=GC_EVAL)
|
函數原型:
??? void cv::grabCut( const Mat& img, Mat& mask, Rect rect,
???????????? Mat& bgdModel, Mat& fgdModel,
???????????? int iterCount, int mode )
其中:
img——待分割的源圖像,必須是8位3通道(CV_8UC3)圖像,在處理的過程中不會被修改;
mask——掩碼圖像,如果使用掩碼進行初始化,那么mask保存初始化掩碼信息;在執行分割的時候,也可以將用戶交互所設定的前景與背景保存到mask中,然后再傳入grabCut函數;在處理結束之后,mask中會保存結果。mask只能取以下四種值:
GCD_BGD(=0),背景;
GCD_FGD(=1),前景;
GCD_PR_BGD(=2),可能的背景;
GCD_PR_FGD(=3),可能的前景。
如果沒有手工標記GCD_BGD或者GCD_FGD,那么結果只會有GCD_PR_BGD或GCD_PR_FGD;
rect——用于限定需要進行分割的圖像范圍,只有該矩形窗口內的圖像部分才被處理;
bgdModel——背景模型,如果為null,函數內部會自動創建一個bgdModel;bgdModel必須是單通道浮點型(CV_32FC1)圖像,且行數只能為1,列數只能為13x5;
fgdModel——前景模型,如果為null,函數內部會自動創建一個fgdModel;fgdModel必須是單通道浮點型(CV_32FC1)圖像,且行數只能為1,列數只能為13x5;
iterCount——迭代次數,必須大于0;
mode——用于指示grabCut函數進行什么操作,可選的值有:
GC_INIT_WITH_RECT(=0),用矩形窗初始化GrabCut;
GC_INIT_WITH_MASK(=1),用掩碼圖像初始化GrabCut;
GC_EVAL(=2),執行分割。
?
源代碼包含在:sample/cpp/grabcut.cpp
OpenCV函數庫里面包含GrabCut的使用:grabcut主要是通過Min Cut: Global minimal enegry in polynomial time實現,具體參考論文
(1):利用圖割法:圖像分割之(三)從Graph Cut到Grab Cut:http://blog.csdn.net/zouxy09/article/details/8534954
???????? OpenCV中的GrabCut算法是依據《"GrabCut" - Interactive Foreground Extraction using Iterated Graph Cuts》這篇文章來實現的。該算法利用了圖像中的紋理(顏色)信息和邊界(反差)信息,只要少量的用戶交互操作即可得到比較好的分割結果。那下面我們來了解這個論文的一些細節。另外OpenCV實現的GrabCut的源碼解讀見下一個博文。接觸時間有限,若有錯誤,還望各位前輩指正,謝謝。
??????? GrabCut是微軟研究院的一個課題,主要功能是分割和摳圖。個人理解它的賣點在于:
(1)你只需要在目標外面畫一個框,把目標框住,它就可以完成良好的分割:
(2)如果增加額外的用戶交互(由用戶指定一些像素屬于目標),那么效果就可以更完美:
(3)它的Border Matting技術會使目標分割邊界更加自然和perfect:
?????? 當然了,它也有不完美的地方,一是沒有任何一個算法可以放之四海而皆準,它也不例外,如果背景比較復雜或者背景和目標相似度很大,那分割就不太好了;二是速度有點慢。當然了,現在也有不少關于提速的改進。
???????? OK,那看了效果,我們會想,上面這些效果是怎么達到的呢?它和Graph Cut有何不同?
(1)Graph Cut的目標和背景的模型是灰度直方圖,Grab Cut取代為RGB三通道的混合高斯模型GMM;
(2)Graph Cut的能量最小化(分割)是一次達到的,而Grab Cut取代為一個不斷進行分割估計和模型參數學習的交互迭代過程;
(3)Graph Cut需要用戶指定目標和背景的一些種子點,但是Grab Cut只需要提供背景區域的像素集就可以了。也就是說你只需要框選目標,那么在方框外的像素全部當成背景,這時候就可以對GMM進行建模和完成良好的分割了。即Grab Cut允許不完全的標注(incomplete labelling)。
?
1、顏色模型
?????? 我們采用RGB顏色空間,分別用一個K個高斯分量(一取般K=5)的全協方差GMM(混合高斯模型)來對目標和背景進行建模。于是就存在一個額外的向量k = {k1, . . ., kn, . . ., kN},其中kn就是第n個像素對應于哪個高斯分量,kn∈ {1, . . . K}。對于每個像素,要不來自于目標GMM的某個高斯分量,要不就來自于背景GMM的某個高斯分量。
所以用于整個圖像的Gibbs能量為(式7):
?????? 其中,U就是區域項,和上一文說的一樣,你表示一個像素被歸類為目標或者背景的懲罰,也就是某個像素屬于目標或者背景的概率的負對數。我們知道混合高斯密度模型是如下形式:
?????? 所以取負對數之后就變成式(9)那樣的形式了,其中GMM的參數θ就有三個:每一個高斯分量的權重π、每個高斯分量的均值向量u(因為有RGB三個通道,故為三個元素向量)和協方差矩陣∑(因為有RGB三個通道,故為3x3矩陣)。如式(10)。也就是說描述目標的GMM和描述背景的GMM的這三個參數都需要學習確定。一旦確定了這三個參數,那么我們知道一個像素的RGB顏色值之后,就可以代入目標的GMM和背景的GMM,就可以得到該像素分別屬于目標和背景的概率了,也就是Gibbs能量的區域能量項就可以確定了,即圖的t-link的權值我們就可以求出。那么n-link的權值怎么求呢?也就是邊界能量項V怎么求?
?????? 邊界項和之前說的Graph Cut的差不多,體現鄰域像素m和n之間不連續的懲罰,如果兩鄰域像素差別很小,那么它屬于同一個目標或者同一背景的可能性就很大,如果他們的差別很大,那說明這兩個像素很有可能處于目標和背景的邊緣部分,則被分割開的可能性比較大,所以當兩鄰域像素差別越大,能量越小。而在RGB空間中,衡量兩像素的相似性,我們采用歐式距離(二范數)。這里面的參數β由圖像的對比度決定,可以想象,如果圖像的對比度較低,也就是說本身有差別的像素m和n,它們的差||zm-zn||還是比較低,那么我們需要乘以一個比較大的β來放大這種差別,而對于對比度高的圖像,那么也許本身屬于同一目標的像素m和n的差||zm-zn||還是比較高,那么我們就需要乘以一個比較小的β來縮小這種差別,使得V項能在對比度高或者低的情況下都可以正常工作。常數γ為50(經過作者用15張圖像訓練得到的比較好的值)。OK,那這時候,n-link的權值就可以通過式(11)來確定了,這時候我們想要的圖就可以得到了,我們就可以對其進行分割了。
?
2、迭代能量最小化分割算法
??????? Graph Cut的算法是一次性最小化的,而Grab Cut是迭代最小的,每次迭代過程都使得對目標和背景建模的GMM的參數更優,使得圖像分割更優。我們直接通過算法來說明:
2.1、初始化
(1)用戶通過直接框選目標來得到一個初始的trimap T,即方框外的像素全部作為背景像素TB,而方框內TU的像素全部作為“可能是目標”的像素。
(2)對TB內的每一像素n,初始化像素n的標簽αn=0,即為背景像素;而對TU內的每個像素n,初始化像素n的標簽αn=1,即作為“可能是目標”的像素。
(3)經過上面兩個步驟,我們就可以分別得到屬于目標(αn=1)的一些像素,剩下的為屬于背景(αn=0)的像素,這時候,我們就可以通過這個像素來估計目標和背景的GMM了。我們可以通過k-mean算法分別把屬于目標和背景的像素聚類為K類,即GMM中的K個高斯模型,這時候GMM中每個高斯模型就具有了一些像素樣本集,這時候它的參數均值和協方差就可以通過他們的RGB值估計得到,而該高斯分量的權值可以通過屬于該高斯分量的像素個數與總的像素個數的比值來確定。
2.2、迭代最小化
(1)對每個像素分配GMM中的高斯分量(例如像素n是目標像素,那么把像素n的RGB值代入目標GMM中的每一個高斯分量中,概率最大的那個就是最有可能生成n的,也即像素n的第kn個高斯分量):
(2)對于給定的圖像數據Z,學習優化GMM的參數(因為在步驟(1)中我們已經為每個像素歸為哪個高斯分量做了歸類,那么每個高斯模型就具有了一些像素樣本集,這時候它的參數均值和協方差就可以通過這些像素樣本的RGB值估計得到,而該高斯分量的權值可以通過屬于該高斯分量的像素個數與總的像素個數的比值來確定。):
(3)分割估計(通過1中分析的Gibbs能量項,建立一個圖,并求出權值t-link和n-link,然后通過max flow/min cut算法來進行分割):
(4)重復步驟(1)到(3),直到收斂。經過(3)的分割后,每個像素屬于目標GMM還是背景GMM就變了,所以每個像素的kn就變了,故GMM也變了,所以每次的迭代會交互地優化GMM模型和分割結果。另外,因為步驟(1)到(3)的過程都是能量遞減的過程,所以可以保證迭代過程會收斂。
(5)采用border matting對分割的邊界進行平滑等等后期處理。
2.3、用戶編輯(交互)
(1)編輯:人為地固定一些像素是目標或者背景像素,然后再執行一次2.2中步驟(3);
(2)重操作:重復整個迭代算法。(可選,實際上這里是程序或者軟件摳圖的撤銷作用)
?
?????? 總的來說,其中關鍵在于目標和背景的概率密度函數模型和圖像分割可以交替迭代優化的過程。更多的細節請參考原文。
(2):利用MeanShift算法:
?? Meanshift簡介:http://blog.csdn.net/crzy_sparrow/article/details/7352994
? 算法介紹:http://blog.csdn.net/carson2005/article/details/7337432
? OpenCV里面有了自帶的例子,可以直接使用!:http://blog.csdn.net/H349117102/article/details/8964266
? No48.?? meanshift_segmentation.cpp
? meanshift圖像分割。三個參數spatialRad、colorRad和maxPyrLevel可調。
MeanShift算法詳細介紹:http://www.cnblogs.com/liqizhou/archive/2012/05/12/2497220.html
Mean Shift算法,一般是指一個迭代的步驟,即先算出當前點的偏移均值,移動該點到其偏移均值,然后以此為新的起始點,繼續移動,直到滿足一定的條件結束.
?1. Meanshift推導
給定d維空間Rd的n個樣本點 ,i=1,…,n,在空間中任選一點x,那么Mean Shift向量的基本形式定義為:?????????????????????????????
?Sk是一個半徑為h的高維球區域,滿足以下關系的y點的集合,
k表示在這n個樣本點xi中,有k個點落入Sk區域中.
以上是官方的說法,即書上的定義,我的理解就是,在d維空間中,任選一個點,然后以這個點為圓心,h為半徑做一個高維球,因為有d維,d可能大于2,所以是高維球。落在這個球內的所有點和圓心都會產生一個向量,向量是以圓心為起點落在球內的點位終點。然后把這些向量都相加。相加的結果就是Meanshift向量。
如圖所以。其中黃色箭頭就是Mh(meanshift向量)。
再以meanshift向量的終點為圓心,再做一個高維的球。如下圖所以,重復以上步驟,就可得到一個meanshift向量。如此重復下去,meanshift算法可以收斂到概率密度最大得地方。也就是最稠密的地方。
最終的結果如下:
Meanshift推導:
?把基本的meanshift向量加入核函數,核函數的性質在這篇博客介紹:http://www.cnblogs.com/liqizhou/archive/2012/05/11/2495788.html
那么,meanshift算法變形為
???????????????????????????????????????????????????????? (1)
解釋一下K()核函數,h為半徑,Ck,d/nhd?為單位密度,要使得上式f得到最大,最容易想到的就是對上式進行求導,的確meanshift就是對上式進行求導.
(2)?????????????
令:
K(x)叫做g(x)的影子核,名字聽上去聽深奧的,也就是求導的負方向,那么上式可以表示
對于上式,如果才用高斯核,那么,第一項就等于fh,k
第二項就相當于一個meanshift向量的式子:
?那么(2)就可以表示為
下圖分析的構成,如圖所以,可以很清晰的表達其構成。
要使得=0,當且僅當=0,可以得出新的圓心坐標:
????????????????????????? (3)?
?
上面介紹了meanshift的流程,但是比較散,下面具體給出它的算法流程。
?
2.meanshift在圖像上的聚類:
真正大牛的人就能創造算法,例如像meanshift,em這個樣的算法,這樣的創新才能推動整個學科的發展。還有的人就是把算法運用的實際的運用中,推動整個工業進步,也就是技術的進步。下面介紹meashift算法怎樣運用到圖像上的聚類核跟蹤。
一般一個圖像就是個矩陣,像素點均勻的分布在圖像上,就沒有點的稠密性。所以怎樣來定義點的概率密度,這才是最關鍵的。
如果我們就算點x的概率密度,采用的方法如下:以x為圓心,以h為半徑。落在球內的點位xi??定義二個模式規則。
(1)x像素點的顏色與xi像素點顏色越相近,我們定義概率密度越高。
(2)離x的位置越近的像素點xi,定義概率密度越高。
所以定義總的概率密度,是二個規則概率密度乘積的結果,可以(4)表示
(4)
其中:代表空間位置的信息,離遠點越近,其值就越大,表示顏色信息,顏色越相似,其值越大。如圖左上角圖片,按照(4)計算的概率密度如圖右上。利用meanshift對其聚類,可得到左下角的圖。
|
|
|
|
| ?
|
?
如有問題,可在線討論。作者:BIGBIGBOAT/Liqizhou
總結
以上是生活随笔為你收集整理的关于抠图的一些文章方法收集的全部內容,希望文章能夠幫你解決所遇到的問題。