比较直方图搜索相似图像 - sumpig/OpenCV GitHub Wiki
本节仅靠比较直方图来测量出两幅图像的相似度。
cv::Mat image= cv::imread("waves.jpg");
cv::Mat input= cv::imread("dog.jpg");
ImageComparator c;
c.setReferenceImage(image);
cout << "waves vs dog: " << c.compare(input) << endl;
class ImageComparator {
private:
cv::Mat refH; // 基准直方图
cv::Mat inputH; // 输入图像的直方图
ColorHistogram hist; // 生成直方图
int nBins; // 每个颜色通道使用的箱子数量
public:
ImageComparator() :nBins(8) {}
为了得到更加可靠的相似度测量结果,需要在计算直方图时减少箱子的数量。
// 设置并计算基准图像的直方图
void setReferenceImage(const cv::Mat& image) {
hist.setSize(nBins);
refH = hist.getHistogram(image);
}
compare 方法会将基准图像和指定的输入图像进行对比。下面的方法返回一个分数,表示两幅图像的相似程度:
// 用BGR 直方图比较图像
double compare(const cv::Mat& image) {
inputH = hist.getHistogram(image);
// 用交叉法比较直方图
return cv::compareHist(refH,inputH, cv::HISTCMP_INTERSECT);
}