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

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

相关文章

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

Python文本相似度计算的方法大全

《Python文本相似度计算的方法大全》文本相似度是指两个文本在内容、结构或语义上的相近程度,通常用0到1之间的数值表示,0表示完全不同,1表示完全相同,本文将深入解析多种文本相似度计算方法,帮助您选... 目录前言什么是文本相似度?1. Levenshtein 距离(编辑距离)核心公式实现示例2. Jac

Python如何实现高效的文件/目录比较

《Python如何实现高效的文件/目录比较》在系统维护、数据同步或版本控制场景中,我们经常需要比较两个目录的差异,本文将分享一下如何用Python实现高效的文件/目录比较,并灵活处理排除规则,希望对大... 目录案例一:基础目录比较与排除实现案例二:高性能大文件比较案例三:跨平台路径处理案例四:可视化差异报

Python中经纬度距离计算的实现方式

《Python中经纬度距离计算的实现方式》文章介绍Python中计算经纬度距离的方法及中国加密坐标系转换工具,主要方法包括geopy(Vincenty/Karney)、Haversine、pyproj... 目录一、基本方法1. 使用geopy库(推荐)2. 手动实现 Haversine 公式3. 使用py

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

MySQL中比较运算符的具体使用

《MySQL中比较运算符的具体使用》本文介绍了SQL中常用的符号类型和非符号类型运算符,符号类型运算符包括等于(=)、安全等于(=)、不等于(/!=)、大小比较(,=,,=)等,感兴趣的可以了解一下... 目录符号类型运算符1. 等于运算符=2. 安全等于运算符<=>3. 不等于运算符<>或!=4. 小于运

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个