图像相似度计算之直方图方法OpenCV实现

2023-11-17

操作步骤:

1.      载入图像(灰度图或者彩色图),并使其大小一致;

2.      若为彩色图,增进行颜色空间变换,从RGB转换到HSV,若为灰度图则无需变换;

3.      若为灰度图,直接计算其直方图,并进行直方图归一化;

4.      若为彩色图,则计算其彩色直方图,并进行彩色直方图归一化;

5.      使用相似度公式,如相关系数、卡方、相交或巴氏距离,计算出相似度值。

	string strSrcImageName = "src.jpg";

	cv::Mat matSrc, matSrc1, matSrc2;

	matSrc = cv::imread(strSrcImageName, CV_LOAD_IMAGE_UNCHANGED);

	cv::resize(matSrc, matSrc1, cv::Size(357, 419), 0, 0, cv::INTER_NEAREST);
	cv::resize(matSrc, matSrc2, cv::Size(2177, 3233), 0, 0, cv::INTER_LANCZOS4);

	cv::Mat matDst1, matDst2;
	cv::Size sizeImage = cv::Size(500, 500); 

	cv::resize(matSrc1, matDst1, sizeImage, 0, 0, cv::INTER_CUBIC);
	//cv::flip(matDst1, matDst1, 1);
	cv::resize(matSrc2, matDst2, sizeImage, 0, 0, cv::INTER_CUBIC);

	if (matSrc.channels() == 1) {
		int histSize = 256;
		float range[] = {0, 256};
		const float* histRange = {range};
		bool uniform = true;
		bool accumulate = false;

		cv::Mat hist1, hist2;

		cv::calcHist(&matDst1, 1, 0, cv::Mat(), hist1, 1, &histSize, &histRange, uniform, accumulate);
		cv::normalize(hist1, hist1, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());

		cv::calcHist(&matDst2, 1, 0, cv::Mat(), hist2, 1, &histSize, &histRange, uniform, accumulate);
		cv::normalize(hist2, hist2, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());

		double dSimilarity = cv::compareHist(hist1, hist2, CV_COMP_CORREL);//,CV_COMP_CHISQR,CV_COMP_INTERSECT,CV_COMP_BHATTACHARYYA

		cout<<"similarity = "<<dSimilarity<<endl;
	} else {
		cv::cvtColor(matDst1, matDst1, cv::COLOR_BGR2HSV);
		cv::cvtColor(matDst2, matDst2, cv::COLOR_BGR2HSV);

		int h_bins = 50, s_bins = 60;
		int histSize[] = {h_bins, s_bins};
		float h_ranges[] = {0, 180};
		float s_ranges[] = {0, 256};
		const float* ranges[] = {h_ranges, s_ranges};
		int channels[] = {0, 1};

		cv::MatND hist1, hist2;

		cv::calcHist(&matDst1, 1, channels, cv::Mat(), hist1, 2, histSize, ranges, true, false);
		cv::normalize(hist1, hist1, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());

		cv::calcHist(&matDst2, 1, channels, cv::Mat(), hist2, 2, histSize, ranges, true, false);
		cv::normalize(hist2, hist2, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());

		double dSimilarity = cv::compareHist(hist1, hist2, CV_COMP_CORREL);

		cout<<"similarity = "<<dSimilarity<<endl;
	}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图像相似度计算之直方图方法OpenCV实现 的相关文章

  • 将 OpenCV Mat 转换为数组(可能是 NSArray)

    我的 C C 技能很生疏 OpenCV 的文档也相当晦涩难懂 有没有办法获得cv Mat data属性转换为数组 NSArray 我想将其序列化为 JSON 我知道我可以使用 FileStorage 实用程序转换为 YAML XML 但这不
  • 从扫描文档中提取行表 opencv python

    我想从扫描的表中提取信息并将其存储为 csv 现在我的表提取算法执行以下步骤 应用倾斜校正 应用高斯滤波器进行去噪 使用 Otsu 阈值进行二值化 进行形态学开局 Canny 边缘检测 进行霍夫变换以获得表格行 去除重复行 10像素范围内相
  • 使用python从gst管道抓取帧到opencv

    我在用着OpenCV http opencv org 和GStreamer0 10 我使用此管道通过自定义套接字通过 UDP 接收 MPEG ts 数据包sockfd由 python 提供并显示它xvimagesink 而且效果很好 以下命
  • Opencv 2.4.2 代码讲解-人脸识别

    我参考OpenCV提供的文档制作了一个人脸识别程序 可以识别多个人脸 并且工作正常 在文档中 他们制作了省略号来突出显示脸部 我不明白的是他们如何计算椭圆的中心 他们的计算如下 for int i 0 i lt faces size i P
  • opencv中如何去除二值图像噪声?

    将图像转换为二值图像 黑白 后如果有任何噪音怎么办 我消除了那些不需要的噪音 您可以看到下图的黑色区域内有一些白噪声 我该如何去除噪声 使用opencv http img857 imageshack us img857 999 blackn
  • java.lang.UnsatisfiedLinkError:java.library.path中没有opencv_java2411

    我正在尝试将 opencv 添加到我的 Spring Boot Maven 项目中 为了使用 opencv 库 我必须在 java library path 中提供本机库 我已将以下命令添加到 Eclipse VM 参数中 Djava li
  • 我的 Opencv 应用程序处理速度非常慢

    我正在构建一个 OpenCV 应用程序 它从相机捕获视频 并在删除背景后将其覆盖在另一个视频上 我无法达到合理的速度 因为它以大约 1 fps 的速度播放输出 而我的背景去除以 3 fps 的速度工作 有没有办法以正常速度显示背景视频并以
  • 旋转矩阵openCV

    我想知道如何找到框架中一组特征的旋转矩阵 我会更具体 我有 2 个具有 20 个特征的帧 假设第 1 帧和第 2 帧 我可以估计两个帧中特征的位置 例如 假设位置 x y 处的某个第 1 帧特征 并且我确切地知道它在哪里 所以假设为 x y
  • 如何在python 3.8中安装opencv-python

    我在 pycharm 中安装 opencv python 时遇到问题 打开 pycharm 后 我单击 设置 然后单击 项目解释器 单击 并搜索正确的模块 我开始安装 但失败了 Could not find a version that s
  • 针对不同处理器架构的 Gradle android 构建

    我想使用 Gradle 为 4 个不同的 Android CPU 处理器架构 armeabi armeabi v7a x86 mips 构建 4 个单独的 apk 我有为 4 个 CPU 架构构建的本机 OpenCV 库libs folde
  • 车辆分割和跟踪

    我已经从事一个项目一段时间了 目的是在无人机捕获的视频中检测和跟踪 移动 车辆 目前我正在使用 SVM 该 SVM 接受了从车辆和背景图像中提取的局部特征的特征袋表示的训练 然后 我使用滑动窗口检测方法来尝试定位图像中的车辆 然后我想要跟踪
  • 在 Tensorflow-lite Android 中将位图转换为 ByteBuffer(浮点)

    在用于图像分类的tensorflow lite android演示代码中 图像首先转换为ByteBuffer格式以获得更好的性能 这种从位图到浮点格式的转换以及随后到字节缓冲区的转换似乎是一个昂贵的操作 循环 按位运算符 float mem
  • 在 virtualenvwrapper 中激活环境

    我安装了virtualenv and virtualenvwrapper用这个命令我创建了一个环境 mkvirtualenv cv 它有效 创建后我就处于新环境中 现在我重新启动了我的电脑 我想activate又是那个环境 但是怎么样 我使
  • 使用 Racket FFI 进行快速阵列访问

    我正在尝试在 Racket 中编写 OpenCV FFI 并达到了需要有效操作数组的地步 然而 我所有使用 Racket FFI 访问数组的尝试都会导致代码效率非常低 有没有办法使用 FFI 快速访问 C 数组 在 Racket 中 这种类
  • OpenCV findContours() 仅返回一个外部轮廓

    我试图隔离验证码中的字母 我设法过滤验证码 结果是这个黑白图像 但是当我尝试使用 OpenCV 的 findContours 方法分离字母时 它只是发现了一个包裹整个图像的外部轮廓 从而产生了该图像 图像外部的黑色轮廓 我将此代码与 Pyt
  • OpenCV InRange 参数

    我在 Android 上使用 OpenCV 来实时查找特定颜色的圆圈 我的第一步是仅保留与我正在寻找的定义颜色相对应的像素 在本例中为红色或绿色 示例图像 https i stack imgur com CIozU jpg 为此 我正在使用
  • Scalar(0,255,0) 在 opencv 中没有给出绿色线

    我正在尝试在图像上绘制渐变线 我希望我的线条是绿色的 并且我使用标量 0 255 0 不过 我只得到黑色 对于 Scalar 0 0 0 我也变黑了 对于 Scalar 255 255 255 我得到白色 但任何组合都没有其他颜色 部分代码
  • IplImage 内的 IplImage

    是否可以使用 OpenCv JavaCv 将图像放置在图像内 例如我有一个 1000x1000 图像和一个 100x100 图像 在 600x600 的位置 我想将较小的图像放置在较大的图像内 假设蓝色框是 1000x1000 IplIma
  • 变形:Opencv 使用 Visual Studio 将图像显示到曲面屏幕

    我正在尝试使用 opencv API 来扭曲图像 以便将其显示到曲面屏幕上 我已经浏览了opencv中提供的翘曲apihere http docs opencv org 2 4 modules stitching doc warpers h
  • 如何使用 Python 3 在 OpenCV 3 上正确加载 cv2.KeyPoint 和描述符?

    有一天 我不得不恢复一个使用 OpenCV 3 和 Python 2 7 的旧项目 在此代码中 要加载 cv2 KeyPoint 我执行以下操作 import numpy as np import cPickle import cv2 ke

随机推荐

  • git操作总结

    git操作总结 一 配置Git 1 配置用户信息 安装git后 第一件事是配置用户名和邮件地址 记录是谁对文件进行了修改 global命令运行一次 永久生效 git config global user name git config gl
  • pandas DataFrame.to_sql() 用法

    to sql 的语法如下 https pandas pydata org pandas docs stable reference api pandas DataFrame to sql html DataFrame to sql name
  • QT-子线程或自定义类操作访问主界面UI控件的几种方法

    前言 QT创建窗体工程 一般在MainWindow或Dialog类里可以直接通过ui指针访问控件 但是添加新的类后又如何访问呢 可以通过以下几种方式 1 将ui指针公开后直接访问 1 例如有个自己定义的类CustomClass 在自定义类里
  • autojs人像变换

    牙叔教程 简单易懂 产品简介 腾讯云神图 人像变换 Face Transformation 基于腾讯优图领先的人脸识别算法 提供人脸年龄变化 人脸性别转换等能力 用户上传照片即可得到实现男女性别切换 人脸变老 变年轻等效果 适用于社交娱乐
  • 1.3 【Mask-RCNN训练自己的数据集】---- Part Three: 用自己训练的模型进行测试(全部流程总结+部分释义)

    三 模型测试 import os import sys sys path remove opt ros kinetic lib python2 7 dist packages import random import math import
  • Linux文件权限一共10位长度,分成四段,每段表示

    1 文件类型 2 文件所有者的权限 3 文件所有者所在组的权限 4 其他用户的权限句号
  • 求两个有序数组的中位数

    leetcode 4 Median of Two Sorted Arrays 题目 给两个有序数组 长度为n和m 在 O log m n 时间内找出两个数组中所有数字的中位数 题解 参考讨论区大佬解法 递归分治方法 先上代码 include
  • c#读取csv到数组_使用C#将CSV文件读入数组 - c#

    我正在尝试创建一个将拉入 读取和分隔csv文件的代码 它有四列 没有标题 我一直在网上找几个小时 似乎没有人真正找到答案 所以我希望这里有人可以 读入后 由于它是设计的一部分 因此我需要能够将其拉得很特别 提前谢谢 参考方案 您的问题有点含
  • How to detect the encoding of a text file with Deno?

    How to detect the encoding of a text file with Python Python 中有一个有用的包 chardet 它有助于检测文件中使用的编码 实际上 没有程序可以 100 确信使用了哪种编码 这就
  • pgsql有dual表?

    在 PostgreSQL 中 没有类似于 Oracle 中的 DUAL 表的概念 然而 您可以使用匿名块 Anonymous Block 来创建一个临时的查询结果集 并在其中进行测试或操作 以下是一个使用匿名块创建临时表的示例 DO DEC
  • 利用SAM实现自动标注

    利用SAM实现自动标注 目录 利用SAM实现自动标注 一 下载安装 1 1 下载SAM Tool和SAM 1 2 下载SAM模型文件 1 3 安装SAM 二 配置项目 三 提取信息 四 获得SAM onnx文件 五 标注 六 格式转换 6
  • 提示 使用驱动器D:中的光盘之前需要将其格式化

    千万不要格式化 直接格式化是最low的做法 方法如下 方法一 chkdsk G f 其中G是你U盘的盘符 f是fix修复的意思 之后电脑就会自动开始修复 修复的时候会告诉你修复了多少多少 最后修复完了 如果硬盘较大就多等会 注意 在此期间不
  • 静息态fMRI状态依赖的有效连接

    文章来源于微信公众号 茗创科技 欢迎有兴趣的朋友搜索关注 导读 大脑在静息状态下存在着不同脑区间的功能连接 并且在多重稳态之间具有内在动态平衡过程 因此 探索特定状态下的功能连接 有利于以加深对精神疾病的理解 然而 与功能连接相比 有效连接
  • 【深入理解C++】运算符重载、插入和提取运算符、拷贝赋值运算符

    文章目录 1 运算符重载 2 重载为友元函数 3 重载为成员函数 4 插入和提取运算符 5 拷贝赋值运算符 5 1 深拷贝 1 运算符重载 运算符重载可以为运算符增加一些新的功能 C 中绝大部分的运算符允许重载 不能重载的运算符有以下几个
  • excel柱状图堆叠图显示总和_如何在Excel堆积柱形图中显示合计值

    在Excel中 用堆积柱形图可以比较相交于类别轴上的每一数值占总数值的大小 对于普通的簇状柱形图 我们可以在每个柱形系列的顶端放置一个数据标志 如数值 来反映各系列数据的大小 对于堆积柱形图 Excel没有提供直接的方法将数据标志显示在柱形
  • mysql - windows下my.ini和linux下my.cnf简单配置

    mysql 设置mysql客户端默认字符集 default character set utf8 mysqld 设置3307端口 port 3307 设置mysql的安装目录 basedir G a workIndex mysql mysq
  • MFC创建窗口流程

    一个MFC程序框架 1 应用程序类 CWinApp 2 框架类 CFrameWnd 流程 1 有且仅有一个全局的应用程序类对象 MyApp myApp 2 在程序入口函数实现 InitInstance 1 给框架类对象动态分配空间 自动调用
  • mysql 大数据量如何导入

    MySQL 有多种方法可以用来导入大数据量 这里列举几种常见的方法 导入数据库备份文件 如果你已经有了数据库的备份文件 可以使用 MySQL 的 mysql 命令行工具来导入 例如 mysql u username p db name lt
  • 【微信小程序】运行机制和更新机制

    观众老爷们好呀 牛牛又更文了 上文我们对部分比较常用的组件进行了讲解 作为开发者 我们还需要对小程序的运行机制和更新机制做一定的了解 那问题来了 你对它们了解多少呢 今天牛牛就带大家测一测 不了解的还不笔记做起来 文章目录 一 运行机制 1
  • 图像相似度计算之直方图方法OpenCV实现

    操作步骤 1 载入图像 灰度图或者彩色图 并使其大小一致 2 若为彩色图 增进行颜色空间变换 从RGB转换到HSV 若为灰度图则无需变换 3 若为灰度图 直接计算其直方图 并进行直方图归一化 4 若为彩色图 则计算其彩色直方图 并进行彩色直