OpenCV學習筆記(2):直方圖的反向投影

直方圖的反向投影
    現在說說直方圖的反向投影,我覺得這是直方圖中最難的部分,我看了跟cvCalcBackProjectPatch相關的讀書章節、中文參考及英文幫助,還是不明白......而網上居然沒有使用cvCalcBackProjectPatch的例程(當然本文寫成之後就有例程了)。前天晚上在半夢半醒之間進入了冥想狀態,突然開竅了,然而在試驗的時候還是遇到了不少問題。
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)步直到輸入圖像的右下角。

 直方圖反向投影示意圖

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

計算直方圖的反向投影  

在左圖(輸入圖像)中查找特定人臉(模板圖像),結果如右圖,中間亮白色的區域爲最匹配區域 

 

 

 

轉自:http://www.cnblogs.com/xrwang/archive/2010/02/04/HowToUseHistogram.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章