Opencv之直方图比较 (涉及内容较多,复习时请看涉及内容)

直方图比较知识
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
相关程序

#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():在图像上写文字:相关知识+案例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w5875895

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值