比较直方图
本例仅靠比较两幅图像的直方图就测量出两幅图像的相似度,封装类后使用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
方法等)。
具体的方法原理已在头文件中写明。