直方圖引入
直方圖是一個(gè)簡(jiǎn)單的表,它給出了一幅圖像或一組圖像中擁有給定數(shù)值的像素?cái)?shù)量。因此,灰度圖像的直方圖有256個(gè)條目(或稱為容器)。0號(hào)容器給出值為0的像素?cái)?shù)目,1號(hào)容器給出值為1的像素個(gè)數(shù),以此類推。
直方圖反投影
直方圖是圖像內(nèi)容的一個(gè)重要特性。如果一幅圖像的區(qū)域中顯示的是一種獨(dú)特的紋理或是一個(gè)獨(dú)特的物體,那么這個(gè)區(qū)域的直方圖可以看做一個(gè)概率函數(shù),它給出的是某個(gè)像素屬于該紋理或物體的概率。這使得我們可以借助圖像的直方圖來檢測(cè)特定的內(nèi)容。 反投影直方圖的方法是一種把目標(biāo)概率分布映射到觀測(cè)圖像的簡(jiǎn)單方法。其作用是,替換一個(gè)輸入圖像中每一個(gè)像素值,使其變成感興趣區(qū)域(ROI)的直方圖中對(duì)應(yīng)的概率值 其在opencv2的C++ API為:
1 2 3 4 5 6 7 8
| cv::calcBackProject(&image, 1, //一幅圖像 channels, //通道數(shù)量 histogram, //進(jìn)行反投影的直方圖 result, //生成的反投影圖像 ranges, //每個(gè)維度的值域 255.0 //縮放因子 );
|
HSV顏色空間
HSV(Hue,Saturation,Value)是根據(jù)顏色的直觀特性(色調(diào)H,飽和度S,亮度V)創(chuàng)建的一種顏色空間, 也稱六角錐體模型(Hexcone Model)。
色調(diào)H
用角度度量,取值范圍為0°~360°,從紅色開始按逆時(shí)針方向計(jì)算,紅色為0°,綠色為120°,藍(lán)色為240°。它們的補(bǔ)色是:黃色為60°,青色為180°,品紅為300°;
飽和度S
取值范圍為0.0~1.0,值越大,顏色越飽和。
亮度V
取值范圍為0.0(黑色)~1.0(白色)。 HSV模型的三維表示從RGB立方體演化而來。設(shè)想從RGB沿立方體對(duì)角線的白色頂點(diǎn)向黑色頂點(diǎn)觀察,就可以看到立方體的六邊形外形。六邊形邊界表示色彩,水平軸表示純度,明度沿垂直軸測(cè)量。
hue表示顏色的相位角,取值范圍是0—-360;S表示顏色的飽和度;S為一比例值,范圍從0到1,它表示成所選顏色的純度和該顏色最大的純度之間的比率,通俗點(diǎn)講,S表示的是某種顏色的“純度”, S取值越大,表示色彩越純,取值越小,表示色彩越灰。V表示色彩的明亮程度,范圍從0到1。V等于0表示圓錐的底部定點(diǎn),也就是黑色,V等于1表示圓錐的頂面,當(dāng)V=1并且S=0時(shí)表示純白色。
應(yīng)用示例:建立顏色概率模型
由于我們要進(jìn)行的是通過一種算法來實(shí)現(xiàn)檢測(cè)特定物體(尤其是人臉)的功能,所以通過這個(gè)示例的引入,來為后面介紹Mean Shift算法打下基礎(chǔ)。 因?yàn)槟w色在顏色空間的分析相當(dāng)集中,但會(huì)受到光照和人種的影響。為了減少膚色收光照強(qiáng)度的影響,通常將顏色空間從RBG轉(zhuǎn)換到亮度和色度分離的某個(gè)顏色空間,如HSV顏色空間,然后放棄亮度分量。 采集膚色樣本,吧膚色樣本中的每個(gè)像素從RGB空間轉(zhuǎn)換到HSV空間,統(tǒng)計(jì)其H分量的直方圖,并對(duì)該直方圖進(jìn)行歸一化處理,就可以得到膚色在H空間的概率分布,該概率分布就是所需的跟蹤模式。
具體步驟如下: 1、將觀測(cè)圖像中每個(gè)像素從RGB空間映射到HSV空間,按公式計(jì)算H分量大小建立起統(tǒng)計(jì)直方圖 2、根據(jù)直方圖進(jìn)行反向投影運(yùn)算,即,將觀測(cè)圖像中的每個(gè)像素值,用其H分量在已建立的統(tǒng)計(jì)直方圖中對(duì)應(yīng)的值代替 3、所得到輸出圖像就是觀測(cè)圖像的顏色概率分布圖像
現(xiàn)在,用程序演示直方圖反投影算法中使用顏色信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| class ContentFinder { private: float hranges[2]; const float* ranges[3]; int channels[3]; float threshold; cv::MatND histogram; public: ContentFinder():threshold(-1.0f){ ranges[0] = hranges;//所有通道的值相同 ranges[1] = hranges; ranges[2] = hranges; } //設(shè)置直方圖的閾值[0,1] void setThreshold(float t) { threshold = t; } //獲取閾值 float getThreshold() { return threshold; } //設(shè)置參考直方圖 void setHistogram(const cv::MatND& h) { histogram = h; cv::normalize(histogram,histogram,1.0);//輸入直方圖必須是歸一化后的 } cv::Mat find(const cv::Mat& image, float minValue,float maxValue, int* channels,int dim); }; cv::Mat ContentFinder::find(const cv::Mat& image, float minValue,float maxValue, int* channels,int dim) { cv::Mat result; hranges[0] = minValue; hranges[1] = maxValue; for(int i=0;i<dim;i++) { this->channels[i] = channels[i]; } cv::calcBackProject(&image,1, //輸入圖片 channels, //所有通道列表 histogram, //直方圖 result, //反投影的結(jié)果 ranges, //值域 255.0 //縮放因子 ); //進(jìn)行閾值化以得到二值圖像 if(threshold > 0.0) cv::threshold(result,result,255*threshold,255,cv::THRESH_BINARY); return result; }
|
均值漂移(Mean Shift)算法
假設(shè)我們現(xiàn)在知道物體的近似位置,概率映射可用于找到的對(duì)象的確切位置。最有可能的位置是在已知窗口區(qū)域中得到最大概率的位置。因此,如果我們從最初的位置開始,并且迭代移動(dòng),邊可以找到精確的位置。這便是均值漂移算法所要完成的任務(wù)。
原理
均值漂移算法以迭代的方式鎖定概率函數(shù)的局部最大值。它主要是尋找預(yù)定義窗口中數(shù)據(jù)點(diǎn)的重心點(diǎn),或者說加權(quán)平均值。該算法將窗口中心移動(dòng)到數(shù)據(jù)點(diǎn)的重心處,并重復(fù)這個(gè)過程直到窗口重心收斂到一個(gè)穩(wěn)定點(diǎn)。 從數(shù)學(xué)角度上說,Mean Shift算法利用概率密度的梯度爬升來尋找局部最優(yōu)。當(dāng)輸入一個(gè)圖像的范圍,然后根據(jù)反向投影圖和輸入的方框進(jìn)行Mean Shift迭代,它是向重心移動(dòng),即向反向投影圖中概率大的地方移動(dòng),所以始終會(huì)移動(dòng)到目標(biāo)上,Mean Shift算法是一個(gè)變步長(zhǎng)的梯度上升算法。 現(xiàn)考慮一個(gè)點(diǎn)集(這可以是經(jīng)過直方圖反投影的像素點(diǎn)的分布),現(xiàn)有一個(gè)小窗口,需要將其移至像素點(diǎn)最密集的區(qū)域。如下圖所示:
最初的窗口表示為C1這個(gè)大的藍(lán)色圓圈,其原始中心為”C1_o”。隨著這個(gè)中心點(diǎn)向局部密度較大的區(qū)域移動(dòng),得到了”C1_r”的中心點(diǎn)。隨著這個(gè)過程的迭代,最終會(huì)得到一個(gè)最大像素點(diǎn)分布的區(qū)域,即C2,該區(qū)域包含了最多數(shù)量的點(diǎn)。
總結(jié)下來,Mean Shift的基本思路是,從每個(gè)像素開始,首先估計(jì)有相似顏色的鄰近像素點(diǎn)的密度(局部密度)的梯度,而后利用迭代算法求出局部密度的峰值(即重心點(diǎn)),把能夠聚類到同一個(gè)峰值點(diǎn)的所有像素點(diǎn)劃分成一個(gè)區(qū)域。
基本流程
(1)選擇跟蹤窗口的大小和初始位置。在Mean Shift跟蹤算法中,核窗寬(即核函數(shù)的定義域的大小,就是搜索窗口的大小)的大小起著非常重要的作用。因?yàn)樗坏珱Q定了參與Mean Shift迭代的樣本數(shù)量,而且也反映了跟蹤窗口的大小。通常,核窗寬由初始跟蹤窗口的尺寸決定,而且在整個(gè)跟蹤過程中不再發(fā)生變化。
(2)計(jì)算跟蹤窗口內(nèi)的質(zhì)心(或重心)。在離散二維(2D)概率分布圖像中,計(jì)算某窗口的質(zhì)心同物理上計(jì)算某物體的質(zhì)心一樣,即利用窗口的零階矩M00和(x,y)的一階矩(M10,M01)之間的關(guān)系,計(jì)算得到窗口的質(zhì)心。
(3)調(diào)整跟蹤窗口的中心到質(zhì)心; (4)重復(fù)第二步和第三步,直到跟蹤窗口中心和質(zhì)心“會(huì)聚”,即每次窗口移動(dòng)的距離小于一定的閾值。
一般一個(gè)圖像就是個(gè)矩陣,像素點(diǎn)均勻的分布在圖像上,就沒有點(diǎn)的稠密性。所以怎樣來定義點(diǎn)的概率密度,這才是最關(guān)鍵的。而我們可以根據(jù)像素點(diǎn)的顏色相近來定義為概率密度高。 其作為人臉跟蹤的應(yīng)用由下圖演示:
優(yōu)點(diǎn)
Mean Shift作為一種高效的模式匹配算法,由于不需要進(jìn)行全局搜索,而且搜索精度高,已經(jīng)廣泛地應(yīng)用在各種模式識(shí)別、實(shí)時(shí)可視跟蹤等領(lǐng)域。
不足
缺乏必要的模型更新方法;整個(gè)跟蹤過程中跟蹤窗口的大小保持不變,當(dāng)目標(biāo)存在尺度變化的時(shí)候會(huì)導(dǎo)致尺度定位不準(zhǔn)確。
連續(xù)自適應(yīng)的Meanshift(CamShift)算法
Bradski根據(jù)Mean Shift算法的不足,提出了Camshift算法。CamShift算法,即Continuously Adaptive Mean-Shift算法,基本思想就是對(duì)視頻圖像的多幀進(jìn)行MeanShift運(yùn)算,將上一幀結(jié)果作為下一幀的初始值,迭代下去。 該算法采用不變矩對(duì)目標(biāo)的尺寸進(jìn)行估算,實(shí)現(xiàn)了連續(xù)自適應(yīng)地調(diào)整跟蹤窗口的大小和位置,并將其應(yīng)用在對(duì)連續(xù)彩色圖像序列中的運(yùn)動(dòng)目標(biāo)的快速跟蹤。 簡(jiǎn)單點(diǎn)說,Mean Shift是針對(duì)單張圖片尋找最優(yōu)迭代結(jié)果,而Camshift則是針對(duì)視頻序列來處理,并對(duì)該序列中的每一幀圖片都調(diào)用Mean Shift來尋找最優(yōu)迭代結(jié)果。正是由于Camshift針對(duì)一個(gè)視頻序列進(jìn)行處理,從而保證其可以不斷調(diào)整窗口的大小,如此一來,當(dāng)目標(biāo)的大小發(fā)生變化的時(shí)候,該算法就可以自適應(yīng)地調(diào)整目標(biāo)區(qū)域繼續(xù)跟蹤。
原理
Camshift算法首先根據(jù)跟蹤目標(biāo)顏色概率模型,將視頻圖像轉(zhuǎn)化為概率分布圖像(PDI),并初始化一個(gè)矩形搜索窗口,對(duì)每一幀PDI圖像利用Mean Shift算法搜索目標(biāo)匹配的最優(yōu)區(qū)域,并根據(jù)搜索區(qū)域的不變矩估算跟蹤目標(biāo)的中心和大小,保存和輸出當(dāng)前幀搜索結(jié)果,并且用當(dāng)前幀搜索結(jié)果作為下一幀圖像初始化搜索窗口。如此循環(huán),即可實(shí)現(xiàn)對(duì)目標(biāo)的連續(xù)跟蹤。Camshift算法是一種動(dòng)態(tài)變化的非參數(shù)密度函數(shù)梯度估計(jì)方法。
具體步驟
(1)創(chuàng)建指定窗口的顏色概率分布圖,初始化一個(gè)搜索窗口W,其大小為S
由上圖左圖的直方圖可以知道,選定區(qū)域最常見的色度范圍。假設(shè)新的視頻幀到來時(shí),每個(gè)像素點(diǎn)的色度值被檢測(cè),通過直方圖給出該像素點(diǎn)的概率值。 (2)利用Mean Shift算法使搜索窗口“收斂”;在2D概率分布圖像中,計(jì)算搜索窗口的質(zhì)心;調(diào)整搜索窗口的中心到計(jì)算的質(zhì)心位置。重復(fù)該過程,直到“收斂”(即中心的位移小于給定的閾值) (3)重新設(shè)置搜索窗口的大小S并計(jì)算跟蹤目標(biāo)的輸出參數(shù),并用新的窗口大小初始化下一幀Mean Shift的搜索窗口
上圖表示通過Camshift算法跟蹤人臉時(shí)計(jì)算一個(gè)視頻幀圖像中可能存在人臉的圖像。黑色像素概率值最低,白色像素概率值最高,灰色像素介于二者之間。 (4)跳轉(zhuǎn)到第二步進(jìn)行下一幀的循環(huán)
下面是Camshift算法的人臉跟蹤演示:
參考資料
OpenCV 3.0.0-dev documentation OpenCV 2 計(jì)算機(jī)視覺編程手冊(cè),科學(xué)出版社 基于OpenCV的人臉跟蹤識(shí)別系統(tǒng)研究,雷靜,西安電子科技大學(xué),碩士學(xué)位論文,2010 Meanshift,聚類算法
|