基于meanshift算法的目标聚类和目标跟踪matlab仿真

news2025/1/12 3:45:12

目录

1.算法描述

2.仿真效果预览

3.MATLAB核心程序

4.完整MATLAB


1.算法描述

       meanshift算法其实通过名字就可以看到该算法的核心,mean(均值),shift(偏移),简单的说,也就是有一个点 ,它的周围有很多个点  我们计算点  移动到每个点  所需要的偏移量之和,求平均,就得到平均偏移量,(该偏移量的方向是周围点分布密集的方向)该偏移量是包含大小和方向的。然后点  就往平均偏移量方向移动,再以此为新的起点不断迭代直到满足一定条件结束。

       中心点就是我们上面所说的  周围的小红点就是  黄色的箭头就是我们求解得到的平均偏移向量。那么图中“大圆圈”是什么东西呢?我们上面所说的周围的点  周围是个什么概念?总的有个东西来限制一下吧。那个“圆圈”就是我们的限制条件,或者说在图像处理中,就是我们搜索迭代时的窗口大小。

       步骤1、首先设定起始点  ,我们说了,是球,所以有半径  , 所有在球内的点就是  , 黑色箭头就是我们计算出来的向量  , 将所有的向量  进行求和计算平均就得到我们的meanshift 向量,也就是图中黄色的向量。 

        接着,再以meanshift向量的重点为圆心,再做一个高维的球,如下图所示,重复上面的步骤,最终就可以收敛到点的分布中密度最大的地方

算法步骤:

           1)在未被标记的数据点中随机选择一个点作为起始中心点center;

           2)找出以center为中心半径为radius的区域中出现的所有数据点,认为这些点同属于一个聚类C,同时在该聚类中记录数据点出现的次数加1;

           3)以center为中心点,计算从center开始到集合M中每个元素的向量,将这些向量相加,得到向量shift;

           4)center=center+shift,即center沿着shift方向移动,移动距离为||shift||;

           5)重复步骤2,3,4,直到shift很小,记得此时的center。注意,这个迭代过程中遇到的点都应该归类到簇C;

           6)如果收敛时当前簇C的center与其它已经存在的簇C2中心的距离小于阈值,那么把C2与C合并,数据点出现次数也对应合并。否则把C作为新的聚类;

           7)重复1,2,3,4,5直到所有点都被标记为已访问;

           8)分类:根据每个类,对每个点的访问频率,取访问频率最大的那个类,作为当前点集的所属类。

 

        对式(33)右边的第二项,我们可以利用Mean Shift算法进行最优化.在Comaniciu等人的文章中,他们只用平均每帧图像只用4.19次Mean Shift迭代就可以收敛,他们的结果很显示在600MHz的PC机上,他们的程序可以每秒处理30帧352240象素的图像.下图显示了各帧需要的Mean Shift迭代次数.

2.仿真效果预览

matlab2022a仿真结果如下:

 

 

3.MATLAB核心程序

........................
 
[cmin, cmax, rmin, rmax ] = select( Image1 );
cmin = round(cmin);
cmax = round(cmax);
rmin = round(rmin);
rmax = round(rmax);
wsize(1) = abs(rmax - rmin);
wsize(2) = abs(cmax - cmin);
 
hsvimage = rgb2hsv(Image1);
% pull out the h
huenorm = hsvimage(:,:,1);
 
hue = huenorm*255;
 
hue=uint8(hue);
 
histogram = zeros(256);
 
for i=rmin:rmax
    for j=cmin:cmax
        index = uint8(hue(i,j)+1);   
 
        histogram(index) = histogram(index) + 1;
    end
end
 
 
 
disp('start');
 
for i = 50:numberofframes-10
    disp('Processing frame');
    disp(i);
%     Frame = M(1, i);
    I = allFrames(:,:,:,i);
    
    % translate to hsv
    hsvimage = rgb2hsv(I);
    % pull out the h
    huenorm = hsvimage(:,:,1);
 
    % scale to 0 to 255
    hue = huenorm*255;
    % set unit type
    hue=uint8(hue);
    
    
    
    [rows cols] = size(hue);
 
    probmap = zeros(rows, cols);
    for r=1:rows
        for c=1:cols
            if(hue(r,c) ~= 0)
                probmap(r,c)= histogram(hue(r,c));   
            end
        end  
    end
    probmap = probmap/max(max(probmap));
    probmap = probmap*255;
    
    count = 0;
    
    rowcenter = 0;  % any number just so it runs through at least twice
    colcenter = 0;
    rowcenterold = 30;
    colcenterold = 30;
 
    while (((abs(rowcenter - rowcenterold) > 2) && (abs(colcenter - colcenterold) > 2)) || (count < 15) )
 
        rmin = max(min(rmin - 15,R),1);  %increase window size and check for center
        rmax = max(min(rmax + 15,R),1);
        cmin = max(min(cmin - 15,C),1);
        cmax = max(min(cmax + 15,C),1);
        
        rowcenterold = rowcenter; %save old center for convergence check
        colcenterold = colcenter;
        
        [ rowcenter colcenter M00 ] = meanshift(I, rmin, rmax, cmin,cmax, probmap);
 
        rmin = round(rowcenter - wsize(1)/2);
        rmax = round(rowcenter + wsize(1)/2);
        cmin = round(colcenter - wsize(2)/2);
        cmax = round(colcenter + wsize(2)/2);
        wsize(1) = abs(rmax - rmin);
        wsize(2) = abs(cmax - cmin);
        
        count = count + 1;
    end
    
 
    G = .2989*I(:,:,1)+.5870*I(:,:,2)+.1140*I(:,:,3);
    
    trackim=I;
  
    
    if isnan(cmin)==0 & isnan(cmax)==0 & isnan(rmin)==0 & isnan(rmax)==0
    for r= rmin:rmax
        trackim(r, cmin,:) = 255;
        trackim(r, cmax,:) = 255;
    end
    for c= cmin:cmax
        trackim(rmin, c,:) = 255;
        trackim(rmax, c,:) = 255;
    end
    end
    centers(i,:) = [colcenter rowcenter];
    % Set window size = 2 * (Moo/256)^1/2
    windowsize = 2 * (M00/256)^.5;
 
    sidelength = sqrt(windowsize);
    
A145

4.完整MATLAB

V

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/112509.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web前端105天-day63-HTML5_CORE

HTML5CORE03 目录 前言 一、复习 二、SVG 三、Echarts 四、Webworker 五、回调地狱 六、Promise 七、promiseajax 八、promise_axios 九、async_await 总结 前言 HTML5CORE03学习开始 一、复习 跨域 浏览器的同源策略限定: 网页中利用 AJAX 请求数据, 必须访问同源…

【CSS】flex布局用法解析,快速上手flex布局,flex:1是什么意思?肯定看的懂好吧?

一、flex布局 flex 是 flexible box 的缩写&#xff0c;意为"弹性布局"&#xff0c;用来为盒状模型提供最大的灵活性。 任何一个容器都可以指定为 flex 布局。 采用 flex 布局的元素&#xff0c;称为 flex 容器&#xff08;flex container&#xff09;&#xff0c;…

如何解决跨越

解决跨域我想在坐的各位都会听说过几个解决跨域的方法&#xff1a; 1.有什么 cors后端配置&#xff08;加几个请求头 2.jsonp&#xff08;利用script的src属性&#xff09; 3.还有vue-cli前端配置。 跨域其实就是违背了浏览器的一种策略&#xff0c;这种策略就是同源策略&…

公司刚来的阿里p8,看完我构建的springboot框架,甩给我一份文档

前言&#xff1a; 我们刚开始学习 JavaWeb 的时候&#xff0c;使用 Servlet/JSP 做开发&#xff0c;一个接口搞一个 Servlet &#xff0c;很头大&#xff0c;后来我们通过隐藏域或者反射等方式&#xff0c;可以减少 Servlet 的创建&#xff0c;但是依然不方便&#xff0c;再后…

【Transformer】医学分割领域的应用与扩展(论文阅读)(二) || DETR

声明:仅学习使用~ 目录 1. Transformer学习2. DETR1. Transformer学习 前篇指路:【Transformer】医学分隔领域的应用与扩展(论文阅读)(一) 继续… 关于Self-Attention的公式: 原来是 m x m 是2D的,现在变成1 x m了,是1D的了。 下图中。左图是传统的Transformer,右…

【python圣诞树的实现】

&#x1f935;‍♂️ 个人主页老虎也淘气 个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f44d;&#x1f3fb; 收藏…

拒不外传,阿里内部耗重金找人总结出这份并发编程手册(全彩版)

并发世界很有趣&#xff0c;不要错过 前言&#xff1a; 时间飞逝&#xff0c;转眼间毕业七年多&#xff0c;从事 Java 开发也六年了。我在想&#xff0c;也是时候将自己的 Java 整理成一套体系。 这一次的知识体系面试题涉及到 Java 知识部分、性能优化、微服务、并发编程、开…

python常用模块

time模块 常用操作 1.直接获取时间 time.time() #获取结果是秒数&#xff0c;即从1970年1月1日8:00起计#1671856010.9592516 2.获取结构化时间 time.localtime() #获取本地时间&#xff0c;中国为东八区&#xff0c;为上海时间 time.gmtime() …

C++控制台圣诞树

前言 有是一年圣诞节&#xff0c;先祝大家圣诞节快乐&#xff0c;所以本蒟蒻在AFO之后决定回来更新一篇打印字符圣诞树的教程 &#xff08;呃好吧我承认我就是想嫖奖品&#xff09; 效果展示 呃我知道这有点拉&#xff0c;但是……蒟蒻能有什么坏心思呢&#xff0c;他只不过想…

客户端服务端交互实现

问题 客户端业务逻辑如何实现&#xff1f; 与服务设备具体交互细节如何设计&#xff1f; 客户端业务逻辑实现 用户输入处理 字符串空格处理&#xff0c;分割获取命令与参数 服务信息处理 字符串预处理&#xff0c;分割获取服务命令存储服务命令与设备地址之间的映射(命令字…

Java Socket实现NIO通信

文章目录一.简单介绍通道&#xff08;Channel&#xff09;多路复用器&#xff08;Selector&#xff09;二.代码实现.客户端服务端运行结果一.简单介绍 NIO 很多人也称之为 Non-block I/O&#xff0c;即非阻塞 I/O&#xff0c;因为这样叫&#xff0c;更能体现它的特点。 为什么…

kdump功能

kdump功能前言1 kdump流程2 kdump配置2.1 kexec、makedumpfile编译2.2 系统内核2.3 捕获内核3 kdump测试4 kdump的不足前言 kdump 是一种先进的基于 kexec 的内核崩溃转储机制。当系统崩溃时&#xff0c;kdump会将内存导出为vmcore保存到磁盘。 在kernel1运行的时候&#xff…

RabbitMQ——延迟队列

目录 一、延迟队列的应用场景 1. 场景&#xff1a;"订单下单成功后&#xff0c;15分钟未支付自动取消" ① 传统处理超时订单 ② RabbitMQ延时队列方案 二、延迟队列中的消息投递和消息消费 1.TTL 和 DLX ① TTL ② DLX和死信队列 ③ 延迟队列 ④ 开发步骤 …

spring mvc 通过异常封装 验证 方法

正常情况 我们先演示一下正常情况下我们验证的方法。 首先定义一个LoginBean Data public class LoginBean {// Blank 不允许保存空格&#xff0c;空格不算内容NotBlank(message "用户名不能为空")String username;// Empty 允许保留空格&#xff0c;是空格也算内容…

【Spring】核心部分之AOP:通过列举代码例子,从底层刨析,深入源码,轻轻松松理解Spring的核心AOP,AOP有这一篇足以

AOP基本概念基本原理专业术语案例演示基于注解&#xff08;重点&#xff09;基于配置文件基本概念 面向切面编程&#xff0c;也叫面向方面编程&#xff0c;利用aop可以对业务逻辑的各个部分进行隔离&#xff0c;从而使得业务逻辑各个部分之间降低耦合&#xff0c;提高程序的可…

AQS 对资源的共享方式

AQS 定义两种资源共享方式 1) Exclusive&#xff08;独占&#xff09; 只有一个线程能执行&#xff0c;如 ReentrantLock。又可分为公平锁和非公平锁,ReentrantLock 同时支持两种锁,下面以 ReentrantLock 对这两种锁的定义做介绍&#xff1a; 下面来看 ReentrantLock 中相关的…

概要设计说明书(GB8567——88)基于协同的在线表格forture-sheet

概要设计说明书 1引言 1.1编写目的 为了帮助用户更好的了解和使用本在线表格&#xff0c;提高用户与软件的亲和度。 用户手册描述配置和使用改在线表格&#xff0c;以及该软件使用过程中应该注意的一下问题。 1.2背景 说明&#xff1a; 本用户手册所描述的软件系统的名称…

医疗检测数据存储管理系统

摘要 医疗信息化的迅速发展导致了医疗数据的指数型增长&#xff0c;医疗检测数据存储管理系统给医院现有信息系统带了巨大的压力。一方面,随着各种非结构化数据的不断涌现&#xff0c;现有的医疗信息系统在存储空间&#xff0c;存储速度、存储结构上达不到医疗检测数据的要求,不…

Github惊现神作,这份算法宝典让你横扫各大厂算法面试题

时间飞逝&#xff0c;转眼间毕业七年多&#xff0c;从事 Java 开发也六年了。我在想&#xff0c;也是时候将自己的 Java 整理成一套体系。 这一次的知识体系面试题涉及到 Java 知识部分、性能优化、微服务、并发编程、开源框架、分布式等多个方面的知识点。 写这一套 Java 面试…

使用Docker搭建Nacos的持久化和集群部署

1. 准备 1.1 mysql安装 下载镜像 docker pull mysql/mysql-server:5.7 在宿主机中相关目录&#xff0c;用于挂载容器的相关数据 mkdir -p /data/mysql/{conf,data} 编写my.cnf配置文件&#xff0c;在/data/mysql/conf目录中 (或下载 直接上传即可) my.cnf.txt - 蓝奏云 / …