当前位置: 首页 > news >正文

基于图像切割计算轨迹相似度

目录

  • 背景
  • 思路与核心代码
  • 数值实验
  • 优缺点分析
  • 参考文献

背景

在前面2文,我们分别讨论了利用夹角余弦来计算轨迹相似度和利用缓冲原理来计算轨迹相似度两种方法,前者可以作为一个baseline提供参考,后者的计算更符合人们的感官和事实,今天,我们要从计算机视觉出发,考察两条轨迹的相似度。

思路与核心代码

可以这么去想,首先,分别将两条轨迹点“串点连线”画出两条轨迹,同时控制画布的大小和渲染颜色,比如都是400*400像素的画布和轨迹都是黑色线段串连,其余都是白色的,如下图所示,

图1 轨迹1
图2 轨迹2

这样比较两条轨迹的相似度就转化为比较两张图片的相似度,而在计算机视觉领域,就有很多方法来比较两张图片相似度,这里采用图像切割法。图像切割法也比较好理解,就是用同样大小的网格去按照同样的方式去切割这两张图片,将图片分成相同数目的子图,相当于建立了一个网格坐标系,轨迹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,imgiimgi=,imgiimgi=
其中, 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提供参考,后者的计算更符合人们的感官和事实&#xff0c…...

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…...

RabbitMQ快速上手及讲解

前言:在介绍RabbitMQ之前,我们先来看下面一个场景: 1.1.1.1 异步处理 场景说明: 用户注册后,需要发注册邮件和注册短信,传统的做法有两种 1.串行的方式 (1)串行方式:将注册信息写入数据库后&a…...

使用多线程std::thread发挥多核计算优势(解答)

使用多线程std::thread发挥多核计算优势(题目) 单核无能为力 如果我们的电脑只有一个核,那么我们没有什么更好的办法可以让我们的程序更快。 因为这个作业限制了你修改算法函数。你唯一能做的就是利用你电脑的多核。 使用多线程 由于我们…...

MySQL分页查询详解:优化大数据集的LIMIT和OFFSET

最近在工作中,我们遇到了一个需求,甲方要求直接从数据库导出一个业务模块中所有使用中的工单信息。为了实现这一目标,我编写了一条SQL查询语句,并请求DBA协助导出数据。尽管工单数量并不多,只有3000多条,但…...

解构赋值、函数默认值

暂时性死区,TDZ(Temporal Dead Zone) var x 1 {let x x//此处声明了x,但是没有对x赋值,相当于在赋值之前引用x,所以会造成报错console.log(x)//报错x is not defined,暂时性死区,…...

【已解决】Mybatis 实现 Group By 动态分组查询

🎉工作中遇到这样一个需求场景:实现一个统计查询,要求可以根据用户在前端界面筛选的字段进行动态地分组统计。也就是说,后端在实现分组查询的时候,Group By 的字段是不确定的,可能是一个字段、多个字段或者…...

Android修改默认gradle路径

Android Studio每次新建项目,都会默认在C盘生成并下载gradle相关文件,由于C盘空间有限,没多久C盘就飘红了,于是就需要把gradle相关文件转移到其他盘 1、到C盘找到gradle文件 具体路径一般是:C:\Users\用户\ .gradle …...

原生JS+canvas实现炫酷背景

原生JScanvas实现炫酷背景 可以在需要的背景页使用 <!doctype html> <html> <head> <meta charset"utf-8"> <title>HTML5 Canvas矩阵粒子波浪背景动画特效</title> <style> html,body { height:100%; } body { …...

Linux学习之NAS服务器搭建

NAS是Network Attached Storage的缩写&#xff0c;也就是网络附属存储。可以使用自己已经不怎么使用的笔记本搭建一台NAS服务器。 fdisk -l可以看一下各个磁盘的状态。 可以看到有sda、sdb、sdc和sdd等四块硬盘。 lvs、vgs和pvs结合起来看&#xff0c;sdb和sdc没有被使用。 …...

分享码云上8个宝藏又有价值的开源图片编辑器

如果你需要高效地处理图片&#xff0c;那么这8款实用工具是可以尝试的&#xff01; 它们能够进行一键抠图、放大、拼接、转矢量图、图标自动生成以及等操作&#xff0c;让你的工作效率飞升&#xff01; 在Gitee这个最有价值的开源项目计划是Gitee综合评定出的优秀开源项目的展示…...

TCP Header都有啥?

分析&回答 源端口号&#xff08;Source Port&#xff09; &#xff1a;16位&#xff0c;标识主机上发起传送的应用程序&#xff1b; 目的端口&#xff08;Destonation Port&#xff09; &#xff1a;16位&#xff0c;标识主机上传送要到达的应用程序。 源端&#xff0c;目…...