opencv学习日记——比较两个直方图的相似性
内容基本就是前几节的综合吧。
一、图像结果
二、代码部分
include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
void show_hist(Mat hist, string name);
Mat hist(Mat a);
int main()
{
Mat img = imread("cat.jpg");
if (img.empty())
{
cout << "输入为空";
return -1;
}
Mat gray, gray1, hist1, hist2;
cvtColor(img, gray, COLOR_BGR2GRAY);
//图片缩小一半
resize(gray, gray1, Size(), 0.5, 0.5);
hist1 = hist(gray);
hist2 = hist(gray1);
//比较两个直方图的相似性
//compareHist(直方图矩阵,直方图矩阵,对比策略)
double hist_hist = compareHist(hist1, hist2, HISTCMP_CORREL);
cout << hist_hist << endl;
show_hist(hist1, "hist1");
show_hist(hist2, "hist2");
return 0;
}
//可视化直方图
void show_hist(Mat hist, string name)
{
int hist_w = 512;
int hist_h = 360;
int width = 2;
Mat img3 = Mat::zeros(hist_h, hist_w, CV_8UC1);
normalize(hist, hist, 1, 0, NORM_INF, -1, Mat());
for (int i = 1; i < hist.rows ; i++ )
{
rectangle(img3, Point(width * (i - 1), hist_h - 1), Point(width * i - 1, hist_h - cvRound(hist_h * hist.at<float>(i - 1)) - 1), Scalar(255, 255, 255), -1);
}
imshow(name, img3);
waitKey(0);
}
//计算直方图矩阵
Mat hist(Mat a)
{
int channels[1] = {0};
Mat hist;
int bins[1] = {256};
float range[2] = {0, 255};
const float * ranges[1] = {range};
calcHist(&a, 1, channels, Mat(), hist, 1, bins, ranges);
return hist;
}