OpenCV3 4.7 比较直方图搜索像素图像

比较直方图

本例仅靠比较两幅图像的直方图就测量出两幅图像的相似度,封装类后使用cv::compareHist函数来实现。

//------------------【程序说明】------------------------
//本头文件为比较直方图等功能封装ImageComparator类
//本头文件需要包含colorhistogram.h头文件
//创建时间:2020/12/21       作者:Eric 南京航空航天大学
//------------------------------------------------------

//--------------【修改和读取参数接口】------------------
//1.设置每个颜色通道使用的箱子数量
//2.读取每个颜色通道使用的箱子数量
//3.设置并计算基准图像的直方图
//------------------------------------------------------

//------------------【具体功能】------------------------
//1.交叉法比较直方图(逐个箱子比较,保存较小值再累加)
//2.卡方测量法比较直方图(累加各箱子归一化平方差)
//3.关联性算法比较直方图(测试信号相似度)
//------------------------------------------------------

#pragma once
#include <opencv2/opencv.hpp>
#include "colorhistogram.h"
class ImageComparator 
{
private:
	cv::Mat refH;       //基准直方图
	cv::Mat inputH;     //输入图像的直方图

	ColorHistogram hist;//生成直方图
	int nBins;			//每个颜色通道使用的箱子数量

public:

	ImageComparator()  
	{
		nBins = 8;
	}

	//设置每个颜色通道使用的箱子数量
	void setNumberOfBins(int bins) 
	{
		nBins = bins;
	}

	//读取每个颜色通道使用的箱子数量
	int getNumberOfBins() 
	{
		return nBins;
	}

	//设置并计算基准图像的直方图
	void setReferenceImage(const cv::Mat& image) 
	{
		hist.setSize(nBins);
		refH = hist.getHistogram(image);
	}

	//读取图像生成直方图并用交叉法比较直方图
	double compare_intersect(const cv::Mat& image) 
	{
		inputH = hist.getHistogram(image);
		return cv::compareHist(refH, inputH, cv::HISTCMP_INTERSECT);
	}

	//读取图像生成直方图并用卡方测量法比较直方图
	double compare_chisqr(const cv::Mat& image)
	{
		inputH = hist.getHistogram(image);
		return cv::compareHist(refH, inputH, cv::HISTCMP_CHISQR);
	}

	//读取图像生成直方图并用关联性算法比较直方图
	double compare_correl(const cv::Mat& image)
	{
		inputH = hist.getHistogram(image);
		return cv::compareHist(refH, inputH, cv::HISTCMP_CORREL);
	}
};

效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

补充:cv::compareHist函数的使用

函数签名

CV_EXPORTS_W double compareHist( InputArray H1, 
                                 InputArray H2, 
                                 int method );

参数分别为:输入直方图1,输入直方图2,比较方法。

函数返回一个double类型的值,根据比较方法的不同,值在有的方法中越大表示越相似(cv::HISTCMP_INTERSECT方法、cv::HISTCMP_CORREL方法等),在有的方法中越小表示越相似(cv::HISTCMP_CHISQR方法等)。

具体的方法原理已在头文件中写明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值