为什么需要直方图比较?
如果你有两张图 就可以对两张直方图进行比较 衡量图像之间的相关性
二十四、直方图比较
利用两张图片的直方图判断两张图片的相似性,也可以判断两个图片是否为同一图片。
1、直方图比较方法
对输入的两张图象计算得到直方图H1与H2,归一化到相同的尺度空间然后可以通过
计算H1和H2之间的距离得到两个直方图的相似程度进而比较图像本身的相似程度。
opencv提供的比较方法有4种:
Correlation相关性比较 HISTCMP_CORREL
如果两个数组H1、H2一样的情况下,相关性最大,得到的值为1。
Chi-Square卡方比较HISTCMP_CHISQR
如果H1、H2完全相同,相关性最大,得到的值为0。
Intersection十字交叉性HISTCMP_INTERSECT(不准确,慎用)
Bhattacharyya distance巴氏距离HISTCMP_BHATTACHARYYA
如果H1、H2完全相同,相关性最大,得到的值为0。
关于 RGB、HSV和HSL颜色空间的说明
RGB颜色空间-三分量线性合成颜色 优点(可以合成所有颜色 面向硬件) 缺点(亮度变化时 三个分量会随之改变)
所以,RGB 颜色空间适合于显示系统,却并不适合于图像处理
HSV颜色空间-多用于图像处理 比RGB更接近人们对于色彩的认知
在 HSV 颜色空间下,比 BGR 更容易跟踪某种颜色的物体,常用于分割指定颜色的物体
HSV 表达彩色图像的方式由三个部分组成:
Hue(色调、色相)范围:0-180
Saturation(饱和度、色彩纯净度)范围:0-255
Value(明度)范围:0-255
https://zhuanlan.zhihu.com/p/67930839
相关API
首先把图像从RGB色彩空间转换到HSV色彩空间cvtColor(直方图基于灰度级别,HSV的HS对亮度很敏感)
计算图像的直方图,然后归一化到0-1之间calcHist和normalize
使用上述四种方法之一进行比较compareHist
compareHist(
InputArray h1,//直方图数据,下同
InputArray h2,
int method//比较方法,上述四种方法之一
)
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <iostream>
#include <math.h>
using namespace cv;
using namespace std;
Mat src, dst,test1, test2;
void compareHist(int, void*);
string convertToString(double d);//将double型数据转为字符型
int main()
{
src = imread("D:/实验台/机器视觉/测试图片/盖茨.jpg");
test1 = imread("D:/实验台/机器视觉/测试图片/盖茨霍夫圆检测.jpg");
test2 = imread("D:/实验台/机器视觉/测试图片/白人女.jpg");
if (src.empty())//如果src这个数据库属性为空
{
cout << "无法打开" << endl;
return -1;
}
imshow("原图未对比", src);
imshow("第一张图 未对比", test1);
imshow("第二张图 未对比", test2);
compareHist(0, 0);
waitKey(0);
return 0;
}
void compareHist(int, void*)
{
//转换bgr为hsv色彩空间(只取HSV中的HS两个色彩空间计算直方图 因为色彩和饱和度是直方图中最敏感的的表征量)
//转换bgr为hsv色彩