【发布时间】:2012-12-03 23:18:07
【问题描述】:
我正在寻找一种方法来比较 2 张图像并获得最匹配的图像作为输出。 我可以在 OpenCV 中使用直方图函数吗?
谁能帮帮我?
但我不知道该怎么做,因为我对 OpenCV 不是很熟悉。 谢谢。
【问题讨论】:
-
比较图像的相似性是非常重要的。您比较的是哪种图像,它们之间的关系如何?
标签: c++ image image-processing opencv
我正在寻找一种方法来比较 2 张图像并获得最匹配的图像作为输出。 我可以在 OpenCV 中使用直方图函数吗?
谁能帮帮我?
但我不知道该怎么做,因为我对 OpenCV 不是很熟悉。 谢谢。
【问题讨论】:
标签: c++ image image-processing opencv
直方图只会确保两个图像具有相似的颜色分布。颜色分布在非常不同的图像中可能是相似的。
举个例子,想象一个黑白 8x8 棋盘格和一个左侧全黑且骑行侧为纯白色的图像。这些图像具有相同的直方图。
【讨论】:
【讨论】:
如果您的目标是找到最匹配的图像,那么 OpenCV 有一个函数 cvMatchTemplate() 可以做到这一点。 Is 确实使用直方图匹配,但不需要在代码中声明任何其他内容。可以找到与正在匹配的模板和文档中可用的其他变体最佳对应的图像部分。
【讨论】:
为每个图像计算 HSV 直方图:
Mat src_mat = imread("./image.jpg");
Mat hsv_mat;
cvtColor( src_mat, hsv_mat, CV_BGR2HSV );
MatND HSV_histogram;
int histSize[] = { 240, 240 };
float h_ranges[] = { 0, 255 };
float s_ranges[] = { 0, 180 };
const float* ranges[] = { h_ranges, s_ranges };
int channels[] = { 0, 1 };
calcHist( &hsv_mat, 1, channels, Mat(), HSV_histogram, 2, histSize, ranges, true, false );
normalize( HSV_histogram, HSV_histogram, 0, 1, NORM_MINMAX, -1, Mat() );
然后进行两两比较,得到相似度分数:
double score_ij = compareHist( HSV_histogram_i, HSV_histogram_j, CV_COMP_BHATTACHARYYA );
您可以通过将图像划分为较小的区域并对结果进行平均来提高准确性。
【讨论】: