直方图比较知识:
相关程序
#include "stdafx.h"
//本节讲述 图像处理之 直方图比较;
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;
string convertToString(double d);
Mat src,test1,test2, dst, map_x, map_y, gray_src;
Mat hsvsrc, hsvtest1, hsvtest2;
char input_title[] = "原图";
int main(int argc, char**argv)
{
src = imread("C:/Users/Rubison.DELL/Desktop\\杂物/壁纸/小白2.jpg"); //存放自己图像的路径
if (!src.data)
{
printf("could not load image...\r\n");
return -1;
}
test1 = imread("C:/Users/Rubison.DELL/Desktop\\杂物/壁纸/小白2修改1.jpg");
test2 = imread("C:/Users/Rubison.DELL/Desktop\\杂物/壁纸/小白2修改2.jpg");
namedWindow(input_title, CV_WINDOW_AUTOSIZE);
imshow(input_title, src);
//Mat src9;
//src.copyTo(src9);
//imshow("赋值",src9);
cvtColor(src, hsvsrc, CV_BGR2HSV);
cvtColor(test1, hsvtest1, CV_BGR2HSV);
cvtColor(test2, hsvtest2, CV_BGR2HSV);
int h_bins = 50; int s_bins = 60;
int histSize[] = { h_bins, s_bins }; // hue varies from 0 to 179,saturation from 0 to 255
float h_ranges[] = { 0, 180 };
float s_ranges[] = { 0, 256 };
const float* ranges[] = { h_ranges, s_ranges };
int channels[] = { 0, 1 }; //use the 0-th or 1-th channels
MatND hist_src, hist_test1, hist_test2; //Mat是二维矩阵 MatND是多维矩阵
/// 计算直方图:
calcHist(&hsvsrc, 1, channels, Mat(), hist_src, 2, histSize, ranges, true, false); //通道数为2 是因为求两张图?2维?
calcHist(&hsvtest1, 1, channels, Mat(), hist_test1, 2, histSize, ranges, true, false);
calcHist(&hsvtest2, 1, channels, Mat(), hist_test2, 2, histSize, ranges, true, false);
normalize(hist_src, hist_src, 0, 1, NORM_MINMAX, -1, Mat());
normalize(hist_test1, hist_test1, 0, 1, NORM_MINMAX, -1, Mat()); //归一化
normalize(hist_test2, hist_test2, 0, 1, NORM_MINMAX, -1, Mat());
double basebase = compareHist(hist_src, hist_src, CV_COMP_CORREL); //直方图比较
double basetest1 = compareHist(hist_src, hist_test1, CV_COMP_CORREL);
double basetest2 = compareHist(hist_src, hist_test2, CV_COMP_CORREL);
double test1test2 = compareHist(hist_test1, hist_test2, CV_COMP_CORREL);
printf("test1 compare with test2 correlation value :%f", test1test2);
Mat test12;
test2.copyTo(test12);
// 将比较的结果转换为string,然后以文字的方式绘制到图形上
putText(src, convertToString(basebase), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, CV_AA);
putText(test1, convertToString(basetest1), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, CV_AA);
putText(test2, convertToString(basetest2), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, CV_AA);
putText(test12, convertToString(test1test2), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, CV_AA);
imshow("src",src);
imshow("test1", test1);
imshow("test2", test2);
imshow("test12", test12);
waitKey(0);
destroyAllWindows();
return 0;
}
string convertToString(double d)
{
ostringstream os;
if (os << d) //把值传递如流中
return os.str(); //获取转换后的字符转并将其写入result
return "invalid conversion";
}
运行结果
备注:!!!!!
涉及知识的储备与学习:
1.有关A.copeTo();的两种用法之:A.copeTo(B):相当与把A复制在B上;
2.MatND:Mat是二维矩阵 MatND是多维矩阵(>=3);
3.string convertToString(double d) :将double转换成string型(string是数据类型中的一种类:string相关知识链接)
4.HSV相关知识:[链接]图像集中格式的知识补充(https://www.cnblogs.com/wangyblzu/p/5710715.html)
5…inRange()函数:图像分割,可分割多通道图片相关知识+案例
6.putText():在图像上写文字:相关知识+案例