compareHist函数
直方圖對比
目標
本文檔嘗試解答如下問題:
- 如何使用OpenCV函數?compareHist?產生一個表達兩個直方圖的相似度的數值。
- 如何使用不同的對比標準來對直方圖進行比較。
原理
-
要比較兩個直方圖(??and??), 首先必須要選擇一個衡量直方圖相似度的?對比標準?() 。
-
OpenCV 函數?compareHist?執行了具體的直方圖對比的任務。該函數提供了4種對比標準來計算相似度:
-
Correlation ( CV_COMP_CORREL )
其中
?是直方圖中bin的數目。
-
Chi-Square ( CV_COMP_CHISQR )
-
Intersection ( CV_COMP_INTERSECT )
-
Bhattacharyya 距離( CV_COMP_BHATTACHARYYA )
源碼
-
本程序做什么?
- 裝載一張?基準圖像?和 兩張?測試圖像?進行對比。
- 產生一張取自?基準圖像?下半部的圖像。
- 將圖像轉換到HSV格式。
- 計算所有圖像的H-S直方圖,并歸一化以便對比。
- 將?基準圖像?直方圖與 兩張測試圖像直方圖,基準圖像半身像直方圖,以及基準圖像本身的直方圖分別作對比。
- 顯示計算所得的直方圖相似度數值。
-
下載代碼: 點擊?這里
-
代碼一瞥:
解釋
聲明儲存基準圖像和另外兩張對比圖像的矩陣( RGB 和 HSV )
Mat src_base, hsv_base; Mat src_test1, hsv_test1; Mat src_test2, hsv_test2; Mat hsv_half_down;裝載基準圖像(src_base) 和兩張測試圖像:
if( argc < 4 ){ printf("** Error. Usage: ./compareHist_Demo <image_settings0> <image_setting1> <image_settings2>\n");return -1;}src_base = imread( argv[1], 1 ); src_test1 = imread( argv[2], 1 ); src_test2 = imread( argv[3], 1 );將圖像轉化到HSV格式:
cvtColor( src_base, hsv_base, CV_BGR2HSV ); cvtColor( src_test1, hsv_test1, CV_BGR2HSV ); cvtColor( src_test2, hsv_test2, CV_BGR2HSV );同時創建包含基準圖像下半部的半身圖像(HSV格式):
hsv_half_down = hsv_base( Range( hsv_base.rows/2, hsv_base.rows - 1 ), Range( 0, hsv_base.cols - 1 ) );初始化計算直方圖需要的實參(bins, 范圍,通道 H 和 S ).
int h_bins = 50; int s_bins = 32; int histSize[] = { h_bins, s_bins };float h_ranges[] = { 0, 256 }; float s_ranges[] = { 0, 180 };const float* ranges[] = { h_ranges, s_ranges };int channels[] = { 0, 1 };創建儲存直方圖的 MatND 實例:
MatND hist_base; MatND hist_half_down; MatND hist_test1; MatND hist_test2;計算基準圖像,兩張測試圖像,半身基準圖像的直方圖:
calcHist( &hsv_base, 1, channels, Mat(), hist_base, 2, histSize, ranges, true, false ); normalize( hist_base, hist_base, 0, 1, NORM_MINMAX, -1, Mat() );calcHist( &hsv_half_down, 1, channels, Mat(), hist_half_down, 2, histSize, ranges, true, false ); normalize( hist_half_down, hist_half_down, 0, 1, NORM_MINMAX, -1, Mat() );calcHist( &hsv_test1, 1, channels, Mat(), hist_test1, 2, histSize, ranges, true, false ); normalize( hist_test1, hist_test1, 0, 1, NORM_MINMAX, -1, Mat() );calcHist( &hsv_test2, 1, channels, Mat(), hist_test2, 2, histSize, ranges, true, false ); normalize( hist_test2, hist_test2, 0, 1, NORM_MINMAX, -1, Mat() );按順序使用4種對比標準將基準圖像(hist_base)的直方圖與其余各直方圖進行對比:
for( int i = 0; i < 4; i++ ){ int compare_method = i;double base_base = compareHist( hist_base, hist_base, compare_method );double base_half = compareHist( hist_base, hist_half_down, compare_method );double base_test1 = compareHist( hist_base, hist_test1, compare_method );double base_test2 = compareHist( hist_base, hist_test2, compare_method );printf( " Method [%d] Perfect, Base-Half, Base-Test(1), Base-Test(2) : %f, %f, %f, %f \n", i, base_base, base_half , base_test1, base_test2 );}結果
使用下列輸入圖像:
|
|
|
|
第一張為基準圖像,其余兩張為測試圖像。同時我們會將基準圖像與它自身及其半身圖像進行對比。
我們應該會預料到當將基準圖像直方圖及其自身進行對比時會產生完美的匹配, 當與來源于同一樣的背景環境的半身圖對比時應該會有比較高的相似度, 當與來自不同亮度光照條件的其余兩張測試圖像對比時匹配度應該不是很好:
下面顯示的是結果數值:
| Correlation | 1.000000 | 0.930766 | 0.182073 | 0.120447 |
| Chi-square | 0.000000 | 4.940466 | 21.184536 | 49.273437 |
| Intersection | 24.391548 | 14.959809 | 3.889029 | 5.775088 |
| Bhattacharyya | 0.000000 | 0.222609 | 0.646576 | 0.801869 |
對于?Correlation?和?Intersection?標準, 值越大相似度越大。因此可以看到對于采用這兩個方法的對比,*基準 - 基準* 的對比結果值是最大的, 而?基準 - 半身?的匹配則是第二好(跟我們預測的一致)。而另外兩種對比標準,則是結果越小相似度越大。 我
總結
以上是生活随笔為你收集整理的compareHist函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: calcBackProject函数(搜索
- 下一篇: compareHist函数 例子