直⽅图⽐较(图⽚相关性⽐较)
直⽅图⽐较⽅法
对输⼊的两张图像计算得到直⽅图H1和H2,归⼀化得到相同的尺度空间然后可以通过计算H1和H2之间的距离得到两个直⽅图相似程度进⽽⽐较图像本⾝的相似程度。opencv提供的⽐较⽅法有四种:
Correlation相关性⽐较(CV_COMP_CORREL)越接近1越相似
Chi-Square卡⽅⽐较(CV_COMP_CHISQR)越接近0越相似
Interction⼗字交叉性(CV_COMP_INTERSECT)对于相似度⽐较这个算法不太好
Bhattacharyya distance巴⽒距离(CV_COMP_BHATTACHARYYA)越接近1越相似
直⽅图⼀般⽐较步骤:
用纸折垃圾盒石漫滩水库加载图像
将图像⾊彩空间由BGR转换为HSV空间(由于直⽅图对亮度和灰度⽐较敏感,⾊彩空间转换就是突出这两个因素尽量去除其他因素)计算直⽅图进⾏归⼀化处理,归⼀化到0到1之间,calcHist和normalize
直⽅图⽐较,使⽤上述四种⽅法之⼀,compareHist
API介绍
API
double compareHist(InputArray h1,InputArray H2,int method)
参数介绍
第⼀个参数InputArray类型 h1,直⽅图数据,下同
第⼆个参数InputArray类型 h2,直⽅图数据,下同
第三个参数int类型 method⽐较⽅法,上述四种⽅法之⼀
返回值:采⽤上述四中⽅法之⼀计算后的两个直⽅图相关系数
代码演⽰
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
#define Pic_Path "/home/image/Pictures/my_picture/"
#define Pic_Name "model_1.jpeg"
#define Pic_Name1 "model_1_gray.jpeg"
#define Pic_Name2 "model_1_point.jpeg"
string convertToString(double d){
ostringstream os;
if(os<<d)
{
return os.str();
}
return"invalid conversion";
}
//直⽅图⽐较
int main(void)
{
string pic =string(Pic_Path)+string(Pic_Name);
cout << pic << endl;
string pic1 =string(Pic_Path)+string(Pic_Name1);
保险公司招聘信息cout << pic1 << endl;
string pic2 =string(Pic_Path)+string(Pic_Name2);
cout << pic2 << endl;
cv::Mat src,srctest1,srctest2;
//读取原始图⽚
src = cv::imread(pic.c_str());
srctest1 = cv::imread(pic1.c_str());
srctest2 = cv::imread(pic2.c_str());
pty()||pty()||pty())
{
cout <<"其中有图⽚不存在"<< endl;
return-1;
}
cv::namedWindow("src",cv::WINDOW_AUTOSIZE);
cv::imshow("src",src);
cv::namedWindow("srctest1",cv::WINDOW_AUTOSIZE);
cv::imshow("srctest1",srctest1);
cv::namedWindow("srctest2",cv::WINDOW_AUTOSIZE);
cv::imshow("srctest2",srctest2);
//从RGB⾊彩空间转化为HSV⾊彩空间⾊调、饱和度、亮度
cvtColor(src, src, CV_BGR2HSV);
cvtColor(srctest1, srctest1, CV_BGR2HSV);
cvtColor(srctest2, srctest2, CV_BGR2HSV);
//定义直⽅图计算所需要的各种参数
int h_bins =50;//直⽅图通道1⾊调级数
西游记人物简介int s_bins =60;//直⽅图通道2饱和度级数
int histSize[]={ h_bins,s_bins };//直⽅图计算函数中的直⽅图级数参数
float h_ranges[]={0,180};//直⽅图通道0⾊调通道值域范围
float s_ranges[]={0,256};//直⽅图通道1饱和度通道值域范围
const float* ranges[]={ h_ranges, s_ranges };//直⽅图计算函数中的直⽅图值域范围参数
int channels[]={0,1};//直⽅图计算函数中的通道参数
//MatND 是 Mat的别名,⽅便区分经过直⽅图计算处理后和输⼊图像
MatND hist_src;
MatND hist_srctest1;
MatND hist_srctest2;
/
/计算直⽅图并归⼀化处理
//原始图像图像数⽬通道数 MAsk 输出直⽅图数据维数直⽅图级数值域范围默认参数1 默认参数2 //const Mat* int const int* InputArray OutputArray int const int* const float* bool bool
calcHist(&src,1, channels,Mat(), hist_src,2, histSize, ranges,true,fal);
normalize(hist_src, hist_src,0,1, NORM_MINMAX,-1,Mat());
calcHist(&srctest1,1, channels,Mat(), hist_srctest1,2, histSize, ranges,true,fal);
normalize(hist_srctest1, hist_srctest1,0,1, NORM_MINMAX,-1,Mat());
calcHist(&srctest2,1, channels,Mat(), hist_srctest2,2, histSize, ranges,true,fal);
normalize(hist_srctest2, hist_srctest2,0,1, NORM_MINMAX,-1,Mat());
//直⽅图⽐较
double src_src =compareHist(hist_src, hist_src, CV_COMP_CORREL);
double src_srctest1 =compareHist(hist_src, hist_srctest1, CV_COMP_CORREL);
double src_srctest2 =compareHist(hist_src, hist_srctest2, CV_COMP_CORREL);
//打印计算后的相关性值
cout <<"src compare with src correlation value : "<< src_src << endl;
cout <<"src compare with srctest1 correlation value : "<< src_srctest1 << endl;
cout <<"src compare with srctest2 correlation value : "<< src_srctest2 << endl;
//给每个图像上添加⽂字,内容为该图⽚和原始图⽚的⽐较结果
putText(src,convertToString(src_src),Point(50,50), CV_FONT_HERSHEY_COMPLEX,1,Scalar(0,255,255),2, LINE_AA); putText(srctest1,convertToString(src_srctest1),Point(50,50), CV_FONT_HERSHEY_COMPLEX,1,Scalar(0,0,255),2, LINE_AA); putText(srctest2,convertToString(src_srctest2),Point(50,50), CV_FONT_HERSHEY_COMPLEX,1,Scalar(255,0,255),2, LINE_AA);
猪图片可爱图片//图像的显⽰
namedWindow("⾃⾝⽐较", CV_WINDOW_AUTOSIZE);
namedWindow("灰度⽐较", CV_WINDOW_AUTOSIZE);
namedWindow("杂质⽐较", CV_WINDOW_AUTOSIZE);
//namedWindow(OUTPUT_TITLE, CV_WINDOW_AUTOSIZE);
老新番动漫imshow("⾃⾝⽐较", src);
imshow("灰度⽐较", srctest1);
imshow("杂质⽐较", srctest2);
cv::waitKey(0);
cv::destroyAllWindows();
}
运⾏结果
/9宫格
home/image/Pictures/my_picture/model_1.jpeg
/home/image/Pictures/my_picture/model_1_gray.jpeg
/home/image/Pictures/my_picture/model_1_point.jpeg
src compare with src correlation value : 1
src compare with srctest1 correlation value : -0.00129504
src compare with srctest2 correlation value : 0.999878
原始图⽚
计算结果
补充知识
⾊调 H : 0 ~ 180
⽤⾓度度量,取值范围为0°~360°,从红⾊开始按逆时针⽅向计算,红⾊为0°,绿⾊为120°, 蓝⾊为240°。它们的补⾊是:黄⾊为60°,青⾊为180°, 品红为300°;
饱和度 S :0 ~ 255
初中生毕业饱和度S表⽰颜⾊接近光谱⾊的程度。⼀种颜⾊,可以看成是某种光谱⾊与⽩⾊混合的结果。其中光谱⾊所占的⽐例愈⼤,颜⾊接近光谱⾊的程度就愈⾼,颜⾊的饱和度也就愈⾼。饱和度⾼,颜⾊则深⽽艳。光谱⾊的⽩光成分为0,饱和度达到最⾼。通常取值范围为0%~100%,值越⼤,颜⾊越饱和。
亮度 V : 0 ~ 255
亮度表⽰颜⾊明亮的程度,对于光源⾊,亮度值与发光体的光亮度有关;对于物体⾊,此值和物体的透射⽐或反射⽐有关。通常取值范围为0%(⿊)到100%(⽩)。