OpenCV比较直方图搜索相似图像

OpenCV比较直方图搜索相似图像,基于内容的图像检索是计算机视觉的一个重要课题。它包括根据一个已有的基准图像,找出一批内容相似的图像。我们已经学过,直方图是标识图像内容的一种有效方式,因此值得研究一下能否用它来解决基于内容的图像检索问题。

这里的关键是,要仅靠比较它们的直方图就测量出两幅图像的相似度。我们需要定义一个测量函数,来评估两个直方图之间的差异程度或相似程度。人们已经提出了很多测量方法,OpenCV在cv::compareHist函数的实现过程中使用了其中的一些方法。

如何实现

为了将一个基准图像与一批图像进行对比并找出其中与它最相似的图像,我们创建了类ImageComparator。这个类引用了一个基准图像和一个输入图像(连同它们的直方图)。另外,因为要用颜色直方图来进行比较,因此ImageComparator中用到了ColorHistogram类:

        class ImageComparator {

          private:
          cv::Mat refH;          // 基准直方图
          cv::Mat inputH;        // 输入图像的直方图

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

          public:
          ImageComparator() :nBins(8) {

          }

为了得到更加可靠的相似度测量结果,需要在计算直方图时减少箱子的数量。可以在类中指定每个BGR通道所用的箱子数量。

用一个适当的设置函数指定基准图像,同时计算参考直方图,代码如下所示:

        // 设置并计算基准图像的直方图
        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);
        }

前面的类可用来检索与给定的基准图像类似的图像。类的实例中使用了基准图像,代码如下所示:

ImageComparator c;
c.setReferenceImage(image);

这里用直方图反向投影中海滩图的彩色版本作为基准图像,并将这幅图像与后面的一系列图像进行对比,其中相似度高的放前面,相似度低的放后面,如下所示:
OpenCV比较直方图搜索相似图像

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!