基于直方图比较的图像相似度计算
2013-12-26 22:19
1511 查看
由于项目需要,这两天看了一些图像相似度计算方面的资料,图像相似度计算就是对两幅图片之间内容的相似程度进行打分,根据分数的高低来判断图像内容的相似程度。在查找资料过程中,首先看到的图像相似度计算方法就是直方图比较。该算法计算过程很容易理解,首先对于两幅图像分别计算其直方图,然后根据某种衡量标准进行比较,比较结果即为两幅图像的相似度。贴心的OpenCV已提供了直方图比较的函数,即compareHist(),该函数提供了四种对比标准来计算相似度,具体计算公式及函数用法可查阅OpenCV参考手册。下面是我实现的直方图比较程序。经过实验发现,由于直方图自身的局限性:仅反映图像像素各灰度值的数量,不能反映图像纹理结构,很明显该方法存在很多误判,比如纹理结构相同,但明暗不同的图像,应该相似度很高,但实际结果是相似度很低,而纹理结构不同,但明暗相近的图像,相似度却很高。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/27/85e82a935496dfc9929e047f0cb2c633)
工程下载链接:http://download.csdn.net/detail/u013085897/6774645
程序基于vs2005 + opencv210实现,下载工程后,如果与自己使用的opencv版本不一致,则需要对工程进行简单配置才能正确运行。
#include "stdafx.h" #include <cv.h> #include <cxcore.h> #include <highgui.h> using namespace cv; // 计算图像直方图 void CompImageHist(Mat &src, MatND &b_hist, MatND &g_hist, MatND &r_hist) { // 分割成3个单通道图像(bgr) vector<Mat> rgb_planes; split(src, rgb_planes); // 设定bin数目及取值范围 int histSize = 255; float range[] = { 0, 255 }; const float* histRange = { range }; // 计算直方图 bool uniform = true; bool accumulate = false; calcHist(&rgb_planes[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRange, uniform, accumulate); calcHist(&rgb_planes[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRange, uniform, accumulate); calcHist(&rgb_planes[2], 1, 0, Mat(), r_hist, 1, &histSize, &histRange, uniform, accumulate); // 直方图归一化>>范围为[0, 1] normalize(r_hist, r_hist, 0, 1, NORM_MINMAX, -1/*, Mat()*/); normalize(g_hist, g_hist, 0, 1, NORM_MINMAX, -1/*, Mat()*/); normalize(b_hist, b_hist, 0, 1, NORM_MINMAX, -1/*, Mat()*/); } int main(int argc, _TCHAR* argv[]) { Mat img0 = imread("image\\lena0.jpg"); imshow("img0", img0); Mat img1 = imread("image\\lena1.jpg"); imshow("img1", img1); MatND hist0[3], hist1[3]; // 计算图像直方图 CompImageHist(img0, hist0[0], hist0[1], hist0[2]); CompImageHist(img1, hist1[0], hist1[1], hist1[2]); double sum[4] = { 0.0 }; double results[4] = { 0.0 }; char channelName[][8] = { { "蓝色" }, { "绿色" }, { "红色" } }; // 比较直方图 printf("各通道比较结果... \n\n"); for (int i = 0; i < 3; i++) { // 相关: CV_COMP_CORREL,卡方: CV_COMP_CHISQR,相交: CV_COMP_INTERSECT,巴氏: CV_COMP_BHATTACHARYYA results[0] = compareHist(hist0[i], hist1[i], CV_COMP_CORREL); results[1] = compareHist(hist0[i], hist1[i], CV_COMP_CHISQR); results[2] = compareHist(hist0[i], hist1[i], CV_COMP_INTERSECT); results[3] = compareHist(hist0[i], hist1[i], CV_COMP_BHATTACHARYYA); sum[0] += results[0]; sum[1] += results[1]; sum[2] += results[2]; sum[3] += results[3]; printf("%s-->相关: %f, 卡方: %f, 相交: %f, 巴氏: %f \n", channelName[i], results[0], results[1], results[2], results[3]); } printf("\n均值-->相关: %f, 卡方: %f, 相交: %f, 巴氏: %f \n", sum[0]/3, sum[1]/3, sum[2]/3, sum[3]/3); waitKey(); return 0; }运行结果:
工程下载链接:http://download.csdn.net/detail/u013085897/6774645
程序基于vs2005 + opencv210实现,下载工程后,如果与自己使用的opencv版本不一致,则需要对工程进行简单配置才能正确运行。
相关文章推荐
- 使用直方图比较图像的相似度
- 图像相似度(测试)--基于直方图特征的图像搜索
- 通过直方图比较图像相似度
- 图像相似度计算之直方图方法OpenCV实现
- 使用直方图比较图像的相似度
- 图像相似度(借鉴)--『原创』+『参考』基于PPC的图像对比程序——使用直方图度量
- 计算图像的梯度及梯度直方图相似度(Matlab代码)
- 图像相似度计算之直方图方法OpenCV实现
- 基于陆地移动距离(EMD)的彩色图像直方图距离计算
- OpenCV学习二十四:基于直方图的图片相似度计算函数 compareHist
- 图像相似度计算之直方图方法OpenCV实现
- 图像相似度计算之直方图方法OpenCV实现
- 直方图比较图像,相似度小于5时重名名
- java:均值哈希实现图像内容相似度比较
- 大规模文档相似度计算—基于MapReduce框架
- 【OpenCV图像处理入门学习教程三】基于SIFT特征和SURF特征的微旋转图像拼接与融合生成全景图像的比较
- OpenCV基于直方图特征的图像搜索
- 基于物品的相似度计算
- 基于直方图的图像增强算法(HE、CLAHE、Retinex)之(一)
- 基于直方图的图像全局二值化算法原理、实现--百分比阈值(P-Tile)