《OpenCV3编程入门》学习笔记9 直方图与匹配(三)直方图对比
9.3 直方圖對比
9.3.1 對比直方圖:compareHist()函數
1.作用:
??比較兩幅直方圖
2.函數原型:
(1)double compareHist(InputArray H1,InputArray H2, int method)
(2)double compareHist(const SpareMat& H1, const SpareMat& H2, int method)
3.參數說明:
(1)直方圖1
(2)直方圖2
(3)距離標準,4種,其中Correlation和Intersection標準值越大表示相似度越高:
??1)相關,Correlation(method=CV_COMP_CORREL)
?????????????
????其中:
????????????????????
????N等于直方圖中bin的個數
??2)卡方,Chi-Square(method=CV_COMP_CHISQR)
?????????????????
??3)直方圖相交,Intersection(method-CV_COMP_INTERSECT)
??4)Bhattacharyya距離,(method=CV_COMP_BHATTACHARYYA)
????Bhattacaryya距離與Hellinger距離相關,也可寫作method=CV_COMP_HELLINGER
??????????????
9.3.2 示例程序
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;int main()
{//【1】聲明儲存基準圖像和另外兩張對比圖象的矩陣(RGB和HSV)Mat srcImage_base, hsvImage_base;Mat srcImage_test1, hsvImage_test1;Mat srcImage_test2, hsvImage_test2;Mat hsvImage_halfDown;//【2】載入基準圖像和兩張測試圖像并顯示srcImage_base = imread("1.jpg", 1);srcImage_test1 = imread("2.jpg", 1);srcImage_test2 = imread("3.jpg", 1);imshow("基準圖像", srcImage_base);imshow("測試圖像1", srcImage_test1);imshow("測試圖像2", srcImage_test2);//【3】將圖像由BGR色彩空間轉換到HSV色彩空間cvtColor(srcImage_base, hsvImage_base, COLOR_RGB2HSV);cvtColor(srcImage_test1, hsvImage_test1, COLOR_RGB2HSV);cvtColor(srcImage_test2, hsvImage_test2, COLOR_RGB2HSV);//【4】創建包含基準圖像下半部的半身圖像(HSV格式)hsvImage_halfDown = hsvImage_base(Range(hsvImage_base.rows / 2, hsvImage_base.rows - 1), Range(0, hsvImage_base.cols - 1));//【5】初始化計算直方圖需要的實參//對hue通道使用30個bin,對saturation通道使用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 };//【6】創建存儲直方圖的MatND類實例MatND baseHist, testHist1, testHist2, halfDownHist;//【7】計算基準圖像,兩張測試圖像,半身基準圖像的HSV直方圖calcHist(&hsvImage_base, 1, channels, Mat(), baseHist, 2, histSize, ranges, true, false);normalize(baseHist, baseHist, 0, 1, NORM_MINMAX, -1, Mat());calcHist(&hsvImage_test1, 1, channels, Mat(), testHist1, 2, histSize, ranges, true, false);normalize(testHist1, testHist1, 0, 1, NORM_MINMAX, -1, Mat());calcHist(&hsvImage_test2, 1, channels, Mat(), testHist2, 2, histSize, ranges, true, false);normalize(testHist2, testHist2, 0, 1, NORM_MINMAX, -1, Mat());calcHist(&hsvImage_halfDown, 1, channels, Mat(), halfDownHist, 2, histSize, ranges, true, false);normalize(halfDownHist, halfDownHist, 0, 1, NORM_MINMAX, -1, Mat());//【8】按順序使用4種對比標準將基準圖像的直方圖與其余各直方圖進行對比for (int i = 0; i < 4; i++){//進行圖像直方圖的對比int compare_method = i;double base_base = compareHist(baseHist, baseHist, compare_method);double base_test1 = compareHist(baseHist, testHist1, compare_method);double base_test2 = compareHist(baseHist, testHist2, compare_method);double base_half = compareHist(baseHist, halfDownHist, compare_method);//輸出結果printf("方法[%d]的匹配結果如下:\n\n【基準圖-基準圖】:%f,【基準圖-測試圖1】:%f,【基準圖-測試圖2】:%f,【基準圖-半身圖】:%f\n", i, base_base, base_test1, base_test2, base_half);printf("----------------------------------------------------------------------------------------------------------------------------------\n");}printf("檢測結束\n");waitKey(0);return 0;
}
運行效果:
?????
????????????
????????????
????????????
總結
以上是生活随笔為你收集整理的《OpenCV3编程入门》学习笔记9 直方图与匹配(三)直方图对比的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 韩国botulax瘦脸针多少钱
- 下一篇: 《OpenCV3编程入门》学习笔记9 直