compareHist函数
直方圖對(duì)比
目標(biāo)
本文檔嘗試解答如下問(wèn)題:
- 如何使用OpenCV函數(shù)?compareHist?產(chǎn)生一個(gè)表達(dá)兩個(gè)直方圖的相似度的數(shù)值。
- 如何使用不同的對(duì)比標(biāo)準(zhǔn)來(lái)對(duì)直方圖進(jìn)行比較。
原理
-
要比較兩個(gè)直方圖(??and??), 首先必須要選擇一個(gè)衡量直方圖相似度的?對(duì)比標(biāo)準(zhǔn)?() 。
-
OpenCV 函數(shù)?compareHist?執(zhí)行了具體的直方圖對(duì)比的任務(wù)。該函數(shù)提供了4種對(duì)比標(biāo)準(zhǔn)來(lái)計(jì)算相似度:
-
Correlation ( CV_COMP_CORREL )
其中
?是直方圖中bin的數(shù)目。
-
Chi-Square ( CV_COMP_CHISQR )
-
Intersection ( CV_COMP_INTERSECT )
-
Bhattacharyya 距離( CV_COMP_BHATTACHARYYA )
源碼
-
本程序做什么?
- 裝載一張?基準(zhǔn)圖像?和 兩張?測(cè)試圖像?進(jìn)行對(duì)比。
- 產(chǎn)生一張取自?基準(zhǔn)圖像?下半部的圖像。
- 將圖像轉(zhuǎn)換到HSV格式。
- 計(jì)算所有圖像的H-S直方圖,并歸一化以便對(duì)比。
- 將?基準(zhǔn)圖像?直方圖與 兩張測(cè)試圖像直方圖,基準(zhǔn)圖像半身像直方圖,以及基準(zhǔn)圖像本身的直方圖分別作對(duì)比。
- 顯示計(jì)算所得的直方圖相似度數(shù)值。
-
下載代碼: 點(diǎn)擊?這里
-
代碼一瞥:
解釋
聲明儲(chǔ)存基準(zhǔn)圖像和另外兩張對(duì)比圖像的矩陣( RGB 和 HSV )
Mat src_base, hsv_base; Mat src_test1, hsv_test1; Mat src_test2, hsv_test2; Mat hsv_half_down;裝載基準(zhǔn)圖像(src_base) 和兩張測(cè)試圖像:
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 );將圖像轉(zhuǎn)化到HSV格式:
cvtColor( src_base, hsv_base, CV_BGR2HSV ); cvtColor( src_test1, hsv_test1, CV_BGR2HSV ); cvtColor( src_test2, hsv_test2, CV_BGR2HSV );同時(shí)創(chuàng)建包含基準(zhǔn)圖像下半部的半身圖像(HSV格式):
hsv_half_down = hsv_base( Range( hsv_base.rows/2, hsv_base.rows - 1 ), Range( 0, hsv_base.cols - 1 ) );初始化計(jì)算直方圖需要的實(shí)參(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 };創(chuàng)建儲(chǔ)存直方圖的 MatND 實(shí)例:
MatND hist_base; MatND hist_half_down; MatND hist_test1; MatND hist_test2;計(jì)算基準(zhǔn)圖像,兩張測(cè)試圖像,半身基準(zhǔn)圖像的直方圖:
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種對(duì)比標(biāo)準(zhǔn)將基準(zhǔn)圖像(hist_base)的直方圖與其余各直方圖進(jìn)行對(duì)比:
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 );}結(jié)果
使用下列輸入圖像:
|
|
|
|
第一張為基準(zhǔn)圖像,其余兩張為測(cè)試圖像。同時(shí)我們會(huì)將基準(zhǔn)圖像與它自身及其半身圖像進(jìn)行對(duì)比。
我們應(yīng)該會(huì)預(yù)料到當(dāng)將基準(zhǔn)圖像直方圖及其自身進(jìn)行對(duì)比時(shí)會(huì)產(chǎn)生完美的匹配, 當(dāng)與來(lái)源于同一樣的背景環(huán)境的半身圖對(duì)比時(shí)應(yīng)該會(huì)有比較高的相似度, 當(dāng)與來(lái)自不同亮度光照條件的其余兩張測(cè)試圖像對(duì)比時(shí)匹配度應(yīng)該不是很好:
下面顯示的是結(jié)果數(shù)值:
| 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 |
對(duì)于?Correlation?和?Intersection?標(biāo)準(zhǔn), 值越大相似度越大。因此可以看到對(duì)于采用這兩個(gè)方法的對(duì)比,*基準(zhǔn) - 基準(zhǔn)* 的對(duì)比結(jié)果值是最大的, 而?基準(zhǔn) - 半身?的匹配則是第二好(跟我們預(yù)測(cè)的一致)。而另外兩種對(duì)比標(biāo)準(zhǔn),則是結(jié)果越小相似度越大。 我
總結(jié)
以上是生活随笔為你收集整理的compareHist函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: calcBackProject函数(搜索
- 下一篇: compareHist函数 例子