基于图像切割计算轨迹相似度
目录
- 背景
- 思路与核心代码
- 数值实验
- 优缺点分析
- 参考文献
背景
在前面2文,我们分别讨论了利用夹角余弦来计算轨迹相似度和利用缓冲原理来计算轨迹相似度两种方法,前者可以作为一个baseline提供参考,后者的计算更符合人们的感官和事实,今天,我们要从计算机视觉出发,考察两条轨迹的相似度。
思路与核心代码
可以这么去想,首先,分别将两条轨迹点“串点连线”画出两条轨迹,同时控制画布的大小和渲染颜色,比如都是400*400像素的画布和轨迹都是黑色线段串连,其余都是白色的,如下图所示,
![]() | ![]() |
这样比较两条轨迹的相似度就转化为比较两张图片的相似度,而在计算机视觉领域,就有很多方法来比较两张图片相似度,这里采用图像切割法。图像切割法也比较好理解,就是用同样大小的网格去按照同样的方式去切割这两张图片,将图片分成相同数目的子图,相当于建立了一个网格坐标系,轨迹1的子图和轨迹2的子图在位置上可以建立起一一对应关系,也就是他们在网格坐标的位置一一对应,如果切割出来的位于网格坐标相同位置的某个子图恰好有轨迹1的一部分,又有轨迹2的一部分,那么就可以认为这个子图是这两条轨迹共同经过的区域,可以设计出一个Kronecker函数,对于任意的相同坐标相同尺寸的2个子图 i m g i img_i imgi和 i m g i ′ img_i' imgi′
K ( i m g i , i m g i ′ ) = { 1 , i m g i ∩ i m g i ′ ≠ ∅ 0 , i m g i ∩ i m g i ′ = ∅ K(img_i, img_i')=\left\{ \begin{aligned} 1 & , img_i \cap img_i' \neq \emptyset\\ 0 &, img_i \cap img_i' = \emptyset \end{aligned} \right. K(imgi,imgi′)={10,imgi∩imgi′=∅,imgi∩imgi′=∅
其中, i m g i img_i imgi表示轨迹1的第i个子图, i m g i ′ img_i' imgi′表示轨迹2的第i个子图。然后,去统计轨迹1经过多少个子图,轨迹2经过多少个子图,其中,轨迹1和轨迹2共同经过的子图有多少个,从而就能计算出这两条轨迹的相似度了。
def trajectoryLine(trajectory, fig_name, grid_num): #轨迹连线绘图并网络切割fig = plt.figure(figsize= (4, 4)) #dpi=300ax = plt.subplot(111)ax.plot(trajectory['lng'], trajectory['lat'], color = 'k') #轨迹图, marker ='.', color = 'k', linewidth = 0.0002ax.set_axis_off()plt.savefig(r"D:\钢联物流\中交轨迹与手机轨迹相似度\图片\{}.png".format(fig_name)) #保存本地buffer_ = io.BytesIO() #开辟新的缓存plt.savefig(buffer_, format = 'png')buffer_.seek(0)image = Image.open(buffer_)image_parts = [] #用来存放切割后的局部图片PIL.Image.Imageweight = int(image.size[0] // grid_num)height = int(image.size[1] // grid_num)for j in range(grid_num):for i in range(grid_num):box = (weight * i, height * j, weight * (i + 1), height * (j + 1))part = image.crop(box)image_parts.append(part)buffer_.close() #释放缓存return image_partsdef whetherBlank(image): #判断一张图片是否纯白,如果是返回0,反之,返回1# image_array = np.int8(image)if np.mean(image)==255: #纯白result = 0else:result = 1return resultdef cvSimilarity(traj1, traj2): #两个轨迹绘制并网格切分traj1_parts = trajectoryLine(traj1, "traj1_line", grid_num = 40)traj2_parts = trajectoryLine(traj2, "traj2_line", grid_num = 40)traj1_list = [whetherBlank(part) for part in traj1_parts]traj2_list = [whetherBlank(part) for part in traj2_parts]print(len(traj1_list))intersection_cnt = 0for i in range(len(traj1_list)):if traj1_list[i]==1 and traj2_list[i]==1:intersection_cnt +=1cv_sim_value = intersection_cnt/(np.sum(traj1_list)+np.sum(traj2_list)-intersection_cnt)print(intersection_cnt, np.sum(traj1_list), np.sum(traj2_list))print("网格相似度", cv_sim_value)return cv_sim_value
数值实验
下面是对不同运单计算出来的相似度对比,整体还不错,前者是基于缓冲的相似度,后者是图像切割相似度,两者具有高度的一致性,但是在相似度高的轨迹,图像切割法会更高,在相似度本来就很低的对比情况下,图像切割法也会略微高出一些。
trajectory
优缺点分析
1,图像切割法直观形象好理解;
2,操作简便,无需做过多的考虑;
3,未考虑小图中各自轨迹点的密集程度的对相似度的影响;
4,网眼尺寸不好把握,其实也可以像缓冲相似度那样设计一个toleranceTest来决定网眼大小,也可以当作一个超参数,设计一个metric来进行调优。
参考文献
1,计算机视觉 - 图像相似度
https://blog.51cto.com/u_15668366/5412298
2,轨迹路线相似度计算
https://blog.csdn.net/weixin_39459401/article/details/129157653
3,Python-Opencv中用compareHist函数进行直方图比较进行对比图片
https://blog.csdn.net/qq_44262417/article/details/89217011
4,计算两幅图像的相似度(PSNR、SSIM、MSE、余弦相似度、MD5、直方图、互信息、Hash)& 代码实现 与举例
https://blog.csdn.net/m0_61899108/article/details/127715737
相关文章:

基于图像切割计算轨迹相似度
目录 背景思路与核心代码数值实验优缺点分析参考文献 背景 在前面2文,我们分别讨论了利用夹角余弦来计算轨迹相似度和利用缓冲原理来计算轨迹相似度两种方法,前者可以作为一个baseline提供参考,后者的计算更符合人们的感官和事实,…...

Day49|leetcode 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II
leetcode 121. 买卖股票的最佳时机 题目链接:121. 买卖股票的最佳时机 - 力扣(LeetCode) 视频链接:动态规划之 LeetCode:121.买卖股票的最佳时机1_哔哩哔哩_bilibili 题目概述 给定一个数组 ,它的第 个元…...

【项目经验】:elementui表格中表头的多选框换成文字
一.项目需求 表格可以多选,表头都是汉字。。。。类似于这种 二.实现功能 用到的方法 Table Attributes 参数说明类型可选值默认值header-cell-class-name表头单元格的 className 的回调方法,也可以使用字符串为所有表头单元格设置一个固定的 className。…...

【LeetCode】剑指 Offer <二刷>(4)
目录 题目:剑指 Offer 09. 用两个栈实现队列 - 力扣(LeetCode) 题目的接口: 解题思路: 代码: 过啦!!! 题目:剑指 Offer 10- I. 斐波那契数列 - 力扣&am…...
CentOS7查看和关闭防火墙
CentOS 7.0默认使用的是firewall作为防火墙 查看防火墙状态 firewall-cmd --state1 停止firewall systemctl stop firewalld.service1 禁止firewall开机启动 systemctl disable firewalld.service 1 转自:CentOS 6和CentOS 7防火墙的关闭 Centos7开放及查看…...

LeetCode 无重复字符的最长子串 打败100%的人
😀前言 LeetCode上的“无重复字符的最长子串”问题要求我们找到给定字符串中不包含重复字符的最长子串的长度。这个问题是一个典型的滑动窗口技巧的应用,需要有效地处理字符出现的情况来找到解决方案。 . 在本解决方案中,我们将探讨两种不同的…...

Spring Boot中通过maven进行多环境配置
上文 java Spring Boot将不同配置拆分入不同文件管理 中 我们说到了,多环境的多文件区分管理 说到多环境 其实不止我们 Spring Boot有 很多的东西都有 那么 这就有一个问题 如果 spring 和 maven 都配置了环境 而且他们配的不一样 那么 会用谁的呢? 此…...
python自动化Selenium的使用
python自动化Selenium的使用 Selenium是一个自动化测试框架,用于模拟和控制浏览器操作,支持多种编程语言。它可以模拟人类用户在浏览器上的操作(如点击、滚动、输入等),并检查网页内容和元素的属性。Selenium可用于对…...

大数据课程K13——Spark的距离度量相似度度量
文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握Spark的距离度量和相似度度量; ⚪ 掌握Spark的欧氏距离; ⚪ 掌握Spark的曼哈顿距离; ⚪ 掌握Spark的切比雪夫距离; ⚪ 掌握Spark的最小二乘法; 一、距离度量和相似度度量 1. …...
Lambda表达式第四版
1、冗余的Runnbale代码 package com.lambda;public class Demo01Runnable {public static void main(String[] args) {RunnableImpl runnable new RunnableImpl();Thread thread new Thread(runnable);thread.start();//Lambda表达式} }class RunnableImpl implements Runnab…...
自定义类加载器
java中自定义类加载器,并将双亲委派改为逆向双亲委派 自定义类加载器JarLoader: package cn.ac.iscas.dmo.common.tools.core.classloader;import org.apache.commons.collections4.MapUtils;import java.io.*; import java.net.URL; import java.net.U…...

【Redis】Redis 的学习教程(七)之 SpringBoot 集成 Redis
在前几篇文章中,我们详细介绍了 Redis 的一些功能特性以及主流的 java 客户端 api 使用方法。 在当前流行的微服务以及分布式集群环境下,Redis 的使用场景可以说非常的广泛,能解决集群环境下系统中遇到的不少技术问题,在此列举几…...

Vlan和Trunk
文章目录 一、VLAN的定义与背景1. 传统以太网的问题(广播域)2. 用VLAN隔离广播域3. VLAN的优点与应用 二、VLAN的转发过程举例三、802.1Q标签:帧格式与作用四、VLAN工作原理交换机端口类型AccessTrunkHybrid PVID(Port VLAN ID&am…...

java 批量下载将多个文件(minio中存储)压缩成一个zip包
我的需求是将minio中存储的文件按照查询条件查询出来统一压成一个zip包然后下载下来。 思路:针对这个需求,其实可以有多个思路,不过也大同小异,一般都是后端返回流文件前端再处理下载,也有少数是压缩成zip包之后直接给…...

nnUNet v2数据准备及格式转换 (二)
如果你曾经使用过nnUNet V1,那你一定明白数据集的命名是有严格要求的,必须按照特定的格式来进行命名才能正常使用。 这一节的学习需要有数据,如果你有自己的数据,可以拿自己的数据来实验,如果没有,可以用十…...

ant-vue1.78版监听a-modal遮罩层的滚动事件
监听a-modal遮罩层的滚动事件 我们开发过程中经常有遇到监听页面滚动的事件需求,去做一些下拉加载或者是下拉分页的需求,我们直接在vue的生命周期中去绑定事件监听非常的方便,但如果是弹框的遮罩层的滚动监听呢?页面的监听完全是…...

MATLAB中residue函数用法
目录 语法 说明 示例 求解具有实根的部分分式展开式 展开具有复数根和同次分子及分母的分式 展开分子次数高于分母次数的分式 residue函数的功能是部分分式展开(部分分式分解)。 语法 [r,p,k] residue(b,a) [b,a] residue(r,p,k) 说明 [r,p…...

攻防世界-Caesar
原题 解题思路 没出现什么特殊字符,可能是个移位密码。凯撒密码加密解密。偏移12位就行。...
嵌入式开发-lin总线介绍 一.概述
1.1lin总线定义和历史 LIN总线(Local Interconnect Network)是一种基于UART/SCI(Universal Asynchronous Receiver-Transmitter/Serial Communication Interface)的低成本串行通信协议。它主要用于汽车、家电、办公设备等多种领域…...

羊城杯-2023-Crypto
文章目录 Danger_RSA题目描述:题目分析: Easy_3L题目描述:题目分析: XOR贯穿始终题目描述:题目分析: MCeorpkpleer题目描述:题目分析: SigninCrypto题目描述:题目分析&am…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...

Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...

Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...