直方圖匹配和 cvCalcBackProject理解(轉)


    OpenCv提供了5種對比直方圖的方式:CORREL(相關)、CHISQR(卡方)、INTERSECT(相交)、BHATTACHARYYAEMD(最小工作距離),其中CHISQR速度最快,EMD速度最慢且有諸多限制,但是EMD的效果最好。世界總是充滿了矛盾,而我們的工作就是化解矛盾(  需要注意的是:EMD方式要求先將直方圖轉換成矩陣:

對比方法:對於直方圖的相關和相交對比,結果值越大(即亮度較高)的地方表示匹配程度越高;
對於直方圖的卡方、BhattacharyyaEMD對比,結果值越小(即越黑暗)的地方表示匹配程度越高。

 

直方圖的反向投影

CalcBackProject

計算反向投影

void cvCalcBackProject( IplImage** image, CvArr* back_project, const CvHistogram* hist );

image

輸入圖像 (也可以傳遞 CvMat** ).

back_project

反向投影圖像,與輸入圖像具有同樣類型.

hist

直方圖

函數 cvCalcBackProject 計算直方圖的反向投影對於所有輸入的單通道圖像同一位置的象素數組,該函數根據相應的象素數組(RGB),放置其對應的直方塊的值到輸出圖像中。用統計學術語,輸出圖像象素點的值是觀測數組在某個分佈(直方圖)下的概率。 例如,爲了發現圖像中的紅色目標,可以這麼做:

1 對紅色物體計算色調直方圖,假設圖像僅僅包含該物體。則直方圖有可能有極值,對應着紅顏色。

2 對將要搜索目標的輸入圖像,使用直方圖計算其色調平面的反向投影,然後對圖像做閾值操作。

3 在產生的圖像中發現連通部分,然後使用某種附加準則選擇正確的部分,比如最大的連通部分。

這是 Camshift 彩色目標跟蹤器中的一個逼進算法,除了第三步,CAMSHIFT 算法使用了上一次目標位置來定位反向投影中的目標。

(注:對cvCalcBackProject的說明引用自http://www.opencv.org.cn/index.php/Cv%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86#CompareHist


1.反向投影的作用是什麼?
    反向投影用於在輸入圖像(通常較大)中查找特定圖像(通常較小或者僅1個像素,以下將其稱爲模板圖像)最匹配的點或者區域,也就是定位模板圖像出現在輸入圖像的位置。
2.反向投影如何查找(工作)?
    查找的方式就是不斷的在輸入圖像中切割跟模板圖像大小一致的圖像塊,並用直方圖對比的方式與模板圖像進行比較。

假設我們有一張100x100的輸入圖像,有一張10x10的模板圖像,查找的過程是這樣的:
1)從輸入圖像的左上角(0,0)開始,切割一塊(0,0)(10,10)的臨時圖像;
2)生成臨時圖像的直方圖;
3)用臨時圖像的直方圖和模板圖像的直方圖對比,對比結果記爲c
4)直方圖對比結果c,就是結果圖像(0,0)處的像素值;
5)切割輸入圖像從(0,1)(10,11)的臨時圖像,對比直方圖,並記錄到結果圖像;
6)重複(1)~(5)步直到輸入圖像的右下角。

3.反向投影的結果是什麼?
    反向投影的結果包含了:以每個輸入圖像像素點爲起點的直方圖對比結果。可以把它看成是一個二維的浮點型數組,二維矩陣,或者單通道的浮點型圖像。
4.特殊情況怎麼樣?
    如果輸入圖像和模板圖像一樣大,那麼反向投影相當於直方圖對比。如果輸入圖像比模板圖像還小,直接罷工~~。
5.使用時有什麼要注意的地方?
    需要注意的地方比較多,我們對照反向投影函數來說:
    (void cvCalcBackProjectPatch
        IplImage** image,   /*輸入圖像:是一個單通道圖像數組,而非實際圖像*/
        CvArr* dst,         /*輸出結果:是一個單通道32位浮點圖像,它的寬度爲W-w+1,高度爲H-h+1,這裏的WH是輸入圖像的寬度和高度,wh是模板圖像的寬度和高度*/
        CvSize patch_size,  /*模板圖像的大小:寬度和高度*/
        CvHistogram* hist,  /*模板圖像的直方圖:直方圖的維數和輸入圖像的個數相同,並且次序要一致;例如:輸入圖像包含色調和飽和度,那麼直方圖的第0維是色調,第1維是飽和度*/
        int method,         /*對比方式:跟直方圖對比中的方式類似,可以是:CORREL(相關)、CHISQR(卡方)、INTERSECT(相交)、BHATTACHARYYA*/
        float factor        /*歸一化因子,一般都設置成1,否則很可能會出錯;中文、英文以及各路轉載的文檔都錯了,這個參數的實際類型是double,而非float我看了源代碼才搞定這個地方*/
    );
    還有最需要注意的地方:這個函數的執行效率非常的低,在使用之前尤其需要注意圖像的大小,直方圖的維數,對比方式。如果說對比單個直方圖對現在的電腦來說是清風拂面,那麼反向投影是狂風海嘯。對於1010x1010RGB輸入圖像,10x10的模板圖像,需要生成1百萬次3維直方圖,對比1百萬次3維直方圖。

發佈了4 篇原創文章 · 獲贊 4 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章