OpenCV-图像处理(25、直方图比较)

栏目: 编程工具 · 发布时间: 6年前

内容简介:版权声明:本文由 Micheal 超 博客 创作,未经博主允许不得转载。 https://blog.csdn.net/qq_42887760/article/details/86527968

版权声明:本文由 Micheal 超 博客 创作,未经博主允许不得转载。 https://blog.csdn.net/qq_42887760/article/details/86527968

直方图比较方法-概述

对输入的两张图像计算得到直方图H1与H2,归一化到相同的尺度空间

然后可以通过计算H1与H2的之间的距离得到两个直方图的相似程度进

而比较图像本身的相似程度。Opencv提供的比较方法有四种:

  • Correlation 相关性比较 -(计算结果范围为 -1到1 -1很不相关,1完全一样 )
  • Chi-Square 卡方比较 -(计算结果越接近0,两个直方图越相似)
  • Intersection 十字交叉性 -(计算公式为取两个直方图每个相同位置的值的最小值,然后求和,这个比较方式不是很好,不建议使用)
  • Bhattacharyya distance 巴氏距离 - (比较结果是很准的,计算结果范围为 0-1 ,0表示两个直方图非常相关,1最不相似)

1. 直方图比较方法-相关性计算(CV_COMP_CORREL)

计算结果范围为 -1到1 -1很不相关,1完全一样

OpenCV-图像处理(25、直方图比较) OpenCV-图像处理(25、直方图比较)

2. 直方图比较方法-卡方计算(CV_COMP_CHISQR)

计算结果越接近0,两个直方图越相似

OpenCV-图像处理(25、直方图比较)

H1,H2分别表示两个图像的直方图数据

3. 直方图比较方法-十字计算(CV_COMP_INTERSECT)

计算公式为取两个直方图每个相同位置的值的最小值,然后求和,这个比较方式不是很好,不建议使用

OpenCV-图像处理(25、直方图比较)

H1,H2分别表示两个图像的直方图数据

4. 直方图比较方法-巴氏距离计算(CV_COMP_BHATTACHARYYA )

比较结果是很准的,计算结果范围为 0-1 ,0表示两个直方图非常相关,1最不相似

OpenCV-图像处理(25、直方图比较) OpenCV-图像处理(25、直方图比较)

H1,H2分别表示两个图像的直方图数据

相关API(cv::compareHist)

  1. 首先把图像从RGB色彩空间转换到HSV色彩空间cvtColor
  2. 计算图像的直方图,然后归一化到[0~1]之间calcHist和normalize;
  3. 使用上述四种比较方法之一进行比较compareHist
compareHist(

InputArray h1, // 直方图数据,下同

InputArray H2,

int method// 比较方法,上述四种方法之一

)

程序步骤:

  • 加载图像数据
    OpenCV-图像处理(25、直方图比较)
  • 从RGB空间转换到HSV空间
    OpenCV-图像处理(25、直方图比较)
  • 计算直方图并归一化
    OpenCV-图像处理(25、直方图比较)
  • 比较直方图,并返回值
    OpenCV-图像处理(25、直方图比较)

程序代码

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace std;
using namespace cv;

string convertToString(double d);

int main(int argc, char** argv) {
	// 1. 声明储存基准图像和另外两张对比图像的矩阵( RGB 和 HSV )
	Mat base, test1, test2;
	Mat hsvbase, hsvtest1, hsvtest2;
	// 2. 装载基准图像(src_base) 和两张测试图像:
	base = imread("E:/Experiment/OpenCV/Pictures/lenanoise.jpg");
	if (!base.data) {
		printf("could not load image...\n");
		return -1;
	}
	test1 = imread("E:/Experiment/OpenCV/Pictures/lena.jpg");
	test2 = imread("E:/Experiment/OpenCV/Pictures/lena1.jpg");
	// 3. 将图像转化到HSV格式:
	cvtColor(base, hsvbase, CV_BGR2HSV);//转换为 HSV 颜色空间,也是3通道
	cvtColor(test1, hsvtest1, CV_BGR2HSV);
	cvtColor(test2, hsvtest2, CV_BGR2HSV);

	// 4. 初始化计算直方图需要的实参(bins, 范围,通道 H 和 S ).
	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 };
	// Use the o-th and 1-st channels     
	int channels[] = { 0, 1 };
		
	// 5. 创建储存直方图的 MatND 实例:
	//ND 表示二维或多维的Mat ,typedef Mat MatND; 源码中MatND的声明。 Mat表示二维的数组
	MatND hist_base;
	MatND hist_test1;
	MatND hist_test2;

	// 6. 计算基准图像,两张测试图像
	calcHist(&hsvbase, 1,  channels, Mat(), hist_base, 2, histSize, ranges, true, false);
	normalize(hist_base, hist_base, 0, 1, NORM_MINMAX, -1, Mat());//归一化到 0-1 之间

	calcHist(&hsvtest1, 1, channels, Mat(), hist_test1, 2, histSize, ranges, true, false);
	normalize(hist_test1, hist_test1, 0, 1, NORM_MINMAX, -1, Mat());

	calcHist(&hsvtest2, 1, channels, Mat(), hist_test2, 2, histSize, ranges, true, false);
	normalize(hist_test2, hist_test2, 0, 1, NORM_MINMAX, -1, Mat());
	

	// 7. 使用4种对比标准将基准图像(hist_base)的直方图与其余各直方图进行对比:
	//比较的算法 CV_COMP_CORREL CHISQR INTERSECT BHATTACHARYYA
	double basebase = compareHist(hist_base, hist_base, CV_COMP_CORREL);
	double basetest1 = compareHist(hist_base, hist_test1, CV_COMP_CORREL);
	double basetest2 = compareHist(hist_base, hist_test2, CV_COMP_CORREL);
	double tes1test2 = compareHist(hist_test1, hist_test2, CV_COMP_CORREL);
	printf("test1 compare with test2 correlation value :%f", tes1test2);

	Mat test12;
	test2.copyTo(test12);
	// 8. 将比较的结果转换为string,然后以文字的方式绘制到图形上
	putText(base, convertToString(basebase), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);
	putText(test1, convertToString(basetest1), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);
	putText(test2, convertToString(basetest2), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);
	putText(test12, convertToString(tes1test2), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);
	
	namedWindow("base", CV_WINDOW_AUTOSIZE);
	namedWindow("test1", CV_WINDOW_AUTOSIZE);
	namedWindow("test2", CV_WINDOW_AUTOSIZE);

	imshow("base", base);
	imshow("test1", test1);
	imshow("test2", test2);
	imshow("test12", test12);

	waitKey(0);
	return 0;
}

string convertToString(double d) {
	ostringstream os;
	if (os << d)  // << 运算符重载了,将double转成string
		return os.str();
	return "invalid conversion";
}

运行截图

OpenCV-图像处理(25、直方图比较) OpenCV-图像处理(25、直方图比较)

参考博客:

  1. https://blog.csdn.net/huanghuangjin/article/details/81175339
  2. https://blog.csdn.net/LYKymy/article/details/83210430

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Art and Science of Java

The Art and Science of Java

Eric Roberts / Addison-Wesley / 2007-3-1 / USD 121.60

In The Art and Science of Java, Stanford professor and well-known leader in CS Education Eric Roberts emphasizes the student-friendly exposition that led to the success of The Art and Science of C. By......一起来看看 《The Art and Science of Java》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具