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

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

目录

1.算法概述

2.部分程序

3.算法部分仿真结果图

4.完整程序获取


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.部分程序

........................
 
[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);
    
.............................................

3.算法部分仿真结果图

 

 

 A145

4.完整程序获取

使用版本matlab2022a

解压密码:C+123456

获得方式1(面包多下载):

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

获取方式2:

如果下载链接失效,加博主微信,或私信

相关文章:

  • Google Earth Engine ——把reducer统计的数据分别放在不同的列表中打印出来,使用unzip()函数
  • Ubuntu 18.04 LTS PWN安装
  • @Bean注解详解
  • Python学习笔记(十二)——面向对象三与运算符的重载
  • 一个基于Python数据大屏可视化开源项目
  • 【day13】【洛谷算法题】-P5713洛谷团队系统-刷题反思集[入门2分支结构]
  • 【开源WebGIS】05-Openlayers访问GeoServer发布的WMS数据并添加标注
  • JavaWeb编年史(青铜时代)
  • 机器学习笔记 - 模式识别的应用场景之一简单车牌识别
  • Selenium基础 — 多窗口操作
  • Nginx之动静分离
  • 怎么成为稚晖君?
  • 离线数仓 (四) --------- 用户行为数据采集模块
  • HACKTHEBOX——Valentine
  • 哈佛结构和冯诺依曼结构
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • Apache的基本使用
  • Babel配置的不完全指南
  • C++类的相互关联
  • CSS居中完全指南——构建CSS居中决策树
  • JavaScript的使用你知道几种?(上)
  • mockjs让前端开发独立于后端
  • scala基础语法(二)
  • 动态魔术使用DBMS_SQL
  • 目录与文件属性:编写ls
  • 排序(1):冒泡排序
  • 前端面试之闭包
  • 前端性能优化--懒加载和预加载
  • 如何借助 NoSQL 提高 JPA 应用性能
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • #、%和$符号在OGNL表达式中经常出现
  • (BFS)hdoj2377-Bus Pass
  • (C#)一个最简单的链表类
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (转)一些感悟
  • (转载)深入super,看Python如何解决钻石继承难题
  • .NET MVC第三章、三种传值方式
  • .NET 常见的偏门问题
  • .NET 事件模型教程(二)
  • .NET成年了,然后呢?
  • .NET的微型Web框架 Nancy
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • @Autowired 与@Resource的区别
  • @EnableAsync和@Async开始异步任务支持
  • @EventListener注解使用说明
  • @Service注解让spring找到你的Service bean
  • [] 与 [[]], -gt 与 > 的比较
  • [<MySQL优化总结>]
  • [bbk5179]第66集 第7章 - 数据库的维护 03
  • [boost]使用boost::function和boost::bind产生的down机一例
  • [C++参考]拷贝构造函数的参数必须是引用类型