1. 程式人生 > >影象處理——反向投影

影象處理——反向投影

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

(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,我看了原始碼才搞定這個地方*/
    )