基于直方图比较的图像相似度计算

2024-08-28 14:18

本文主要是介绍基于直方图比较的图像相似度计算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       由于项目需要,这两天看了一些图像相似度计算方面的资料,图像相似度计算就是对两幅图片之间内容的相似程度进行打分,根据分数的高低来判断图像内容的相似程度。在查找资料过程中,首先看到的图像相似度计算方法就是直方图比较。该算法计算过程很容易理解,首先对于两幅图像分别计算其直方图,然后根据某种衡量标准进行比较,比较结果即为两幅图像的相似度。贴心的OpenCV已提供了直方图比较的函数,即compareHist(),该函数提供了四种对比标准来计算相似度,具体计算公式及函数用法可查阅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_BHATTACHARYYAresults[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版本不一致,则需要对工程进行简单配置才能正确运行。

这篇关于基于直方图比较的图像相似度计算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1115001

相关文章

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

对postgresql日期和时间的比较

《对postgresql日期和时间的比较》文章介绍了在数据库中处理日期和时间类型时的一些注意事项,包括如何将字符串转换为日期或时间类型,以及在比较时自动转换的情况,作者建议在使用数据库时,根据具体情况... 目录PostgreSQL日期和时间比较DB里保存到时分秒,需要和年月日比较db里存储date或者ti

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境