天天看點

OpenCV直方圖均衡化和直方圖比較原理及反向投影原理

1.直方圖均衡化

直方圖均衡就是讓照片的灰階分布拉寬,然後圖像對比度變大則變的清晰。方圖均衡化方法的基本思想是對在圖像中像素個數多的灰階級進行展寬,而對像素個數少的灰階級進行縮減。進而達到清晰圖像的目的。

OpenCV直方圖均衡化和直方圖比較原理及反向投影原理

 F_x(x) 就相當于已知的第二點,即原始圖檔的像素的機率分布,F_Y(y)就相當于已知的第三點.即轉換後的圖檔的像素要均勻分布.現在要求的是就相當于已知的第三點.即轉換後的圖檔的像素要均勻分布.現在要求的是 y = T(x)$的這個T是什麼樣的.這樣就可以把原圖的像素x,轉換成均衡化後的圖檔的像素y。

用變量 r表示待處理圖像的灰階。假設 r 的取值範圍為 [0,L−1] ,且 r=0表示黑色,r=L−1 表示白色。在 rr滿足這些條件的情況下,我們注意裡幾種在變換形式:

OpenCV直方圖均衡化和直方圖比較原理及反向投影原理

滿足條件:

(a) T(r) 在區間 0≤r≤L−1上為嚴格單調遞增函數。

(b) 當 0≤r≤L−1 時,0≤T(r)≤L−1 。

OpenCV直方圖均衡化和直方圖比較原理及反向投影原理

一幅圖像的灰階值可以看成是區間 [0,L−1]内的随機變量。随機變量的基本描繪是其機率密度函數令 pr(r) 和 ps(s)分别表示變量 r和 s 的機率密度函數,其中 p 的下标用于訓示 pr 和 ps 是不同的函數。有基本機率論得到的一個基本結果是,如果 pr(r) 和T(r) 已知,且在感興趣的值域上T(r) 是連續且可微的,則變換(映射)後的變量 s 的機率密度函數如下:

OpenCV直方圖均衡化和直方圖比較原理及反向投影原理

這樣,輸出灰階變量s的機率密度函數是由變換函數 T(r)決定的。而在圖像進行中特别重要的也比較常用的變化如下:

OpenCV直方圖均衡化和直方圖比較原理及反向投影原理

其中,w 是假積分變量。公式右邊是随機變量 r 的累計分布函數。因為機率密度函數總為正,一個函數的積分是該函數下方的面積。則上式子則滿足(a)條件,當 r=L−1 時,則積分值等于1,是以 s 的最大值是 L−1,是以上式滿足條件(b)。

OpenCV直方圖均衡化和直方圖比較原理及反向投影原理
OpenCV直方圖均衡化和直方圖比較原理及反向投影原理

由 ps(s) 可知,這是一個均勻機率密度函數。簡而言之,(2)中的變換将得到一個随機變量 s ,該随機變量有一個均勻的機率密度函數表征。而 ps(s) 始終是均勻的,它于 pr(r) 的形式無關。對于離散值,我們處理其機率(直方圖值)與求和來替代處理機率密度函數與積分。則一幅數字圖像中灰階級 rk 出現的機率近似為:

OpenCV直方圖均衡化和直方圖比較原理及反向投影原理

其中,MN是圖像中像素的總數,nk 是灰階為 rk 的像素個數, L 是圖像中可能的灰階級的數量(8bit圖像時256)。與 rk 相對的 pr(rk)圖形通常稱為直方圖。離散形式為:

OpenCV直方圖均衡化和直方圖比較原理及反向投影原理

關于機率密度和機率分布函數要是忘記了就自己找書看吧!!!

2.直方圖比較

對輸入的兩張圖像計算得到直方圖H1與H2,歸一化到相同的尺度空間然後可以通過計算H1與H2的之間的距離得到兩個直方圖的相似程度進而比較圖像本身的相似程度。Opencv提供的比較方法有四種:

1)直方圖比較方法-相關性計算(CV_COMP_CORREL)

計算結果範圍為 -1到1 -1很不相關,1完全一樣

OpenCV直方圖均衡化和直方圖比較原理及反向投影原理

2)直方圖比較方法-卡方計算(CV_COMP_CHISQR)

計算結果越接近0,兩個直方圖越相似

OpenCV直方圖均衡化和直方圖比較原理及反向投影原理

3)直方圖比較方法-十字計算(CV_COMP_INTERSECT)

計算公式為取兩個直方圖每個相同位置的值的最小值,然後求和,這個比較方式不是很好,不建議使用

OpenCV直方圖均衡化和直方圖比較原理及反向投影原理

4)直方圖比較方法-巴氏距離計算(CV_COMP_BHATTACHARYYA )

比較結果是很準的,計算結果範圍為 0-1 ,0表示兩個直方圖非常相關,1最不相似

OpenCV直方圖均衡化和直方圖比較原理及反向投影原理

3.反向投影

假設我們有一張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,        

                                                 CvSize patch_size, 

                                                 CvHistogram* hist, 

                                                 int               method,        

                                                float             factor       

    );

還有最需要注意的地方:這個函數的執行效率非常的低,在使用之前尤其需要注意圖像的大小,直方圖的維數,對比方式。

繼續閱讀