d(H1,H2) 2. 对比直方图:compareHist()函数 c++函数原型 double compareHist(InputArray H1,InputArray H2,i" />
首页 > 分享 > Opencv3笔记28——直方图对比

Opencv3笔记28——直方图对比

1. 对比

要对两个直方图进行比较,首先必须选择一个衡量直方图相似度的对比标准。我们用compareHist()函数来对比两个直方图的相似度,函数的返回值就是d(H1,H2)" role="presentation">d(H1,H2)

2. 对比直方图:compareHist()函数

c++函数原型

double compareHist(InputArray H1,InputArray H2,int method) double compareHist(const SparseMat& H1,const SparseMat & H2,int method)1234 2.1.相关 Correlation(method = CV_COMP_CORREL)

d(H1,H2)=∑I(H1(I)−H¯1)(H2(I)−H¯2)∑I(H1(I)−H¯1)2∑I(H2(I)−H¯2)2" role="presentation">d(H1,H2)=∑I(H1(I)−H¯1)(H2(I)−H¯2)∑I(H1(I)−H¯1)2∑I(H2(I)−H¯2)2

其中:

H¯k=1N∑JHk(J)" role="presentation">H¯k=1N∑JHk(J)

且 N" role="presentation">N等于直方图中bin

2.2. 卡方 Chi-Square(method = CV_COMP_CHISQR)

d(H1,H2)=∑I(H1(I)−H2(I))2H1(I)" role="presentation">d(H1,H2)=∑I(H1(I)−H2(I))2H1(I)

2.3.直方图相交 Intersection(method = CV_COMP_INTERSECT)

d(H1,H2)=∑Imin(H1(I),H2(I))" role="presentation">d(H1,H2)=∑Imin(H1(I),H2(I))

2.4. Bhattacharyya距离(method = CV_COMP_BHATTACHARYYA)

这里的Bhattacharyya距离和Hellinger距离有关,也可以写做method = CV_COMP_HELLINGER

d(H1,H2)=1−1H¯1H¯2N2∑IH1(I)⋅H2(I)" role="presentation">d(H1,H2)=1−1H¯1H¯2N2∑IH1(I)⋅H2(I)

3. 示例程序:直方图对比

#include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" using namespace cv; int main() { //两张对比图像的矩阵 Mat srcImage_base, hsvImage_base; Mat srcImage_test1, hsvImage_test1; Mat srcImage_test2, hsvImage_test2; Mat hsvImage_halfDown; //载入基准图像和两张测试图像 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); //将图像BGR转化为HSV色彩图像 cvtColor(srcImage_base, hsvImage_base, COLOR_BGR2HSV); cvtColor(srcImage_test1, hsvImage_test1, COLOR_BGR2HSV); cvtColor(srcImage_test2, hsvImage_test2, COLOR_BGR2HSV); //创建包含基准图像下半部的半身图像HSV格式 hsvImage_halfDown = hsvImage_base(Range(hsvImage_base.rows / 2, hsvImage_base.rows - 1), Range(0, hsvImage_base.cols - 1)); //初始化计算直方图的参数 //对hue通道使用30个bin对saturation通道使用32bin int h_bins = 50; int s_bins = 60; int histSize[] = { h_bins,s_bins }; float h_ranges[] = { 0,256 }; float s_ranges[] = { 0,180 }; const float * ranges[] = { h_ranges,s_ranges }; //使用0和1通道 int channels[] = { 0,1 }; //创建存储直方图的MatND类的实例 MatND baseHist; MatND halfDownHist; MatND testHist1; MatND testHist2; //计算基准图像,两张测试图像,半身基准图像的HSV直方图 calcHist(&hsvImage_base, 1, channels, Mat(), baseHist, 2, histSize, ranges, true, false); normalize(baseHist, baseHist, 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()); 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()); //按照顺序是哦那个4中比较标准将基准图像与其余的直方图进行对比 for (int i = 0; i < 4; i++) { //进行直方图对比 int compare_method = i; double base_base = compareHist(baseHist, baseHist, compare_method); double base_half = compareHist(baseHist, halfDownHist, compare_method); double base_test1 = compareHist(baseHist, testHist1, compare_method); double base_test2 = compareHist(baseHist, testHist2, compare_method); //输出结果 printf("方法 [%d] 的匹配结果如下:nn 【基准图-基准图】:%f, 【基准图-半身图】:%f,【基准图-测试图1】:%f,【基准图-测试图2】:%fn---------------------------------------n", i, base_base, base_half, base_test1, base_test2); } printf("检测结束。"); waitKey(0); return 0; }

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879

这里写图片描述
这里写图片描述

这里写图片描述

这里写图片描述

相关知识

使用pandas绘制两列csv的直方图
鸢尾花分类与直方图、散点图的绘制及可视化决策树
「插花笔记 Vol.10」春日花园
园林植物病虫害知识点归纳笔记
时尚插花艺术:西方与东方风格对比
科学网—科研笔记·【兰吐幽香】
加拿大28
摄影师常用的3个花卉摄影技巧,学会了你也能拍出唯美的花卉照片
运用逆光拍出透明感植物
园林花卉笔记

网址: Opencv3笔记28——直方图对比 https://m.huajiangbk.com/newsview541270.html

所属分类:花卉
上一篇: WebService通过Get方
下一篇: Python 机器学习 随机森林