如何不仅用直方图比较图像?

How to compare the images not only with histogram?

我正在编程比较两张图片。 感谢 Whosebug 和 google,我可以获得有关比较方法的信息。

大部分是OpenCV自带的比较直方图的方法。 他们通常很酷。

但是,在某些情况下,问题会发生。

让我举几个例子。

两张图片除了颜色外其他都一样。 (实际上是倒过来的。)在这种情况下,图像的轮廓是相同的,但是通过直方图比较,它说两个图像之间没有关系。

从那时起,我想知道是否有一种算法或方法不仅可以比较直方图,还可以比较轮廓。我也觉得'outline'很含糊,不知道怎么换句话说。

感谢阅读。 :)

没有一种方法可以适用于所有情况。无论选择哪种图片比对方式,都必须先考虑自己的需求和可能的图片集。

如果您对要比较的两个图像一无所知,则必须结合使用不同的技术,如直方图匹配、模板匹配、特征匹配等。

对于这种颜色不同但结构相同的特殊情况,您可以使用以下策略:

  1. 找出每个图像中的轮廓。
  2. 您将获得两张轮廓图像....每张图像一张
  3. 对其应用模板匹配。

您可以使用 Hu moments

// Find contours
std::vector<std::vector<cv::Point> > contours;
cv::findContours(image, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
cv::Moments mom = cv::moments(contours[0]); 
double hu[7];
cv::HuMoments(mom, hu); // now in hu are your 7 Hu-Moments

hu 矩是一个包含 7 个分量的向量。如果您提取两个图像的向量,那么您可以使用二次差分来比较它们。它看起来像这样:

float Distance::distEuclidean(const std::vector<float>& query, const std::vector<float>& item_db)
{
float sum = 0;
for (int i = 0; i < query.size();i++)
{
    float v1 = query.at(i);
    float v2 = item_db.at(i);
    sum += (v1-v2)*(v1-v2);
}
float distance = sqrt(sum);
return distance;
}

请注意 hu[7] 是一个 c 向量,函数的输入是一个 c++ std::vector