基于图像切割计算轨迹相似度
目录
- 背景
- 思路与核心代码
- 数值实验
- 优缺点分析
- 参考文献
背景
在前面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…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...