日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

compareHist函数

發布時間:2025/4/16 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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直方圖,并歸一化以便對比。
    • 將?基準圖像?直方圖與 兩張測試圖像直方圖,基準圖像半身像直方圖,以及基準圖像本身的直方圖分別作對比。
    • 顯示計算所得的直方圖相似度數值。
  • 下載代碼: 點擊?這里

  • 代碼一瞥:

#include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include <stdio.h>using namespace std; using namespace cv;/** @函數 main */ int main( int argc, char** argv ) {Mat src_base, hsv_base;Mat src_test1, hsv_test1;Mat src_test2, hsv_test2;Mat hsv_half_down;/// 裝載三張背景環境不同的圖像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 );/// 轉換到 HSVcvtColor( src_base, hsv_base, CV_BGR2HSV );cvtColor( src_test1, hsv_test1, CV_BGR2HSV );cvtColor( src_test2, hsv_test2, CV_BGR2HSV );hsv_half_down = hsv_base( Range( hsv_base.rows/2, hsv_base.rows - 1 ), Range( 0, hsv_base.cols - 1 ) );/// 對hue通道使用30個bin,對saturatoin通道使用32個binint h_bins = 50; int s_bins = 60;int histSize[] = { h_bins, s_bins };// hue的取值范圍從0到256, saturation取值范圍從0到180float h_ranges[] = { 0, 256 };float s_ranges[] = { 0, 180 };const float* ranges[] = { h_ranges, s_ranges };// 使用第0和第1通道int channels[] = { 0, 1 };/// 直方圖MatND hist_base;MatND hist_half_down;MatND hist_test1;MatND hist_test2;/// 計算HSV圖像的直方圖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() );///應用不同的直方圖對比方法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 );}printf( "Done \n" );return 0;}

解釋

  • 聲明儲存基準圖像和另外兩張對比圖像的矩陣( 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 );}
  • 結果

  • 使用下列輸入圖像:

    第一張為基準圖像,其余兩張為測試圖像。同時我們會將基準圖像與它自身及其半身圖像進行對比。

  • 我們應該會預料到當將基準圖像直方圖及其自身進行對比時會產生完美的匹配, 當與來源于同一樣的背景環境的半身圖對比時應該會有比較高的相似度, 當與來自不同亮度光照條件的其余兩張測試圖像對比時匹配度應該不是很好:

  • 下面顯示的是結果數值:

  • 對比標準 基準 - 基準 基準 - 半身 基準 - 測試1 基準 - 測試2
    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函数的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。