OpenCV中的直方图函数

时间:2011-02-09 17:48:39

标签: c++ image image-processing opencv

我正在寻找一种方法来比较2张图像并获得最匹配的图像作为输出。 在 OpenCV 中使用直方图功能可以这样做吗?

有人可以帮助我吗?

但我不知道怎么做,因为我对OpenCV不是很熟悉。 谢谢。

4 个答案:

答案 0 :(得分:2)

直方图将确保两个图像具有相似的颜色分布。颜色分布在非常不同的图像中可能是相似的。

作为一个例子,想象一下黑白8x8棋盘和左侧全黑,骑行侧纯白的图像。这些图像具有相同的直方图。

答案 1 :(得分:0)

这两个答案都讨论了OpenCV中的直方图:

Horizontal Histogram in OpenCV

Horizontal Histogram in OpenCV

答案 2 :(得分:0)

如果您的目标是找到最匹配的图像,那么OpenCV有一个函数cvMatchTemplate()来执行此操作。是否使用直方图匹配,但不需要在代码中声明任何其他内容。可以找到最匹配匹配模板的图像部分以及文档中提供的其他变体。

答案 3 :(得分:0)

对于每个图像计算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 );

您可以通过在较小的区域划分图像并平均结果来提高准确度。