圖像處理——反向投影

首先感謝以下三位的博文幫助我理解反向投影。

(1)yee_yj    http://blog.csdn.net/yee_yj/article/details/6035913

(2)viewcode   http://blog.csdn.net/viewcode/article/details/8209067

(3)幻語星雲  http://blog.sina.com.cn/s/blog_8902954301017bki.html


反向投影圖就是圖像對應位置像素的數量統計,也可以看做是密度統計。 反向投影圖在某一位置的值是原圖對應位置的像素值在原圖的總數目。


例如位置(0,0)上的像素值0,對應的bin爲[0,4),直方圖統計出位於[0,4)的像素值的Histogram爲4,所以其反向投影圖的值即爲4;位置(3,,3)上的像素值15,對應的bin爲[12,16),直方圖統計出位於[12,16)的像素值的Histogram爲2,所以其反向投影圖的值即爲2。

反向投影:一種記錄給定圖像中的像素點如何適應直方圖模型像素分佈的方式。簡單的講, 所謂反向投影就是首先計算某一特徵的直方圖模型,然後使用模型去尋找圖像中存在的該特徵。

backproject是直接取直方圖Histogram中的值,即以灰度爲例,某種灰度值在整幅圖像中所佔面積越大,其在直方圖中的值越大,backproject時,其對應的像素的新值越大(越亮),反過來,某灰度值所佔面積越小,其新值就越小。


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

假設我們有一張100x100的輸入圖像,有一張10x10的模板圖像,查找的過程是這樣的:
(1)從輸入圖像的左上角(0,0)開始,切割一塊(0,0)至(10,10)的臨時圖像;
(2)生成臨時圖像的直方圖;
(3)用臨時圖像的直方圖和模板圖像的直方圖對比,對比結果記爲c;
(4)直方圖對比結果c,就是結果圖像(0,0)處的像素值;
(5)切割輸入圖像從(0,1)至(10,11)的臨時圖像,對比直方圖,並記錄到結果圖像;
(6)重複(1)~(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,我看了源代碼才搞定這個地方*/
    )


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