比较直方图搜索相似图像 - 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);
}