zl程序教程

您现在的位置是:首页 >  后端

当前栏目

基于Canny边缘提取和形态学处理的公交车上车人数跟踪和统计matlab仿真

MATLAB边缘统计 处理 基于 仿真 提取 跟踪
2023-09-11 14:15:33 时间

目录

一、理论基础

二、核心MATLAB程序

三、MATLAB仿真测试结果


一、理论基础

整个算法的整体流程图如下图所示:

 

       这里,我们使用的是canny边缘检测,其基本原理如下所示:

       阶跃形的边缘,Canny推导出的最优边缘检测器的形状与高斯函数和一阶导数类似,因此Canny边缘检测器就是由高斯函数的一阶导数构成的。我们知道,高斯函数是圆对称的,因此Canny算子在边缘方向上是对称的,在垂直于边缘的方向上是反对称的。这就意味着该算子对最急剧的变化方向上的边缘特别敏感,但在沿边缘方向上是不敏感的。

       利用高斯函数的可分性,将▽G的两个滤波卷积模板分解为两个一维的行列滤波器:

        根据Canny的定义,中心边缘点为算子nG与图像f(x,y)的卷积在边缘梯度方向上的区域中的最大值。这样,就可以在每一点的梯度方向上判断此点强度是否为其领域的最大值来确定该点是否为边缘点。当一个像素满足以下三个条件时,则被认为是图像的边缘点。 

(1)该点的边缘强度大于沿该点梯度方向的两个相邻像素点的边缘强度;

(2)与该点梯度方向上相邻两点的方向差小于45度; 

(3)以该点为中心的33领域中的边缘强度极大值小于某个阈值。  此外,如果(1)和(2)同时被满足,那么在梯度方向上的两相邻像素就从候选边缘点中取消,条件(3)相当于区域梯度最大值组成的阈值图像与边缘点进行匹配,这一过程消除了许多虚假的边缘点。  图像边缘检测的基本步骤: 

(1) 滤波,边缘检测主要基于导数计算,但受噪声的影响。但滤波器在降低噪 声的同时也导致了边缘强度的损失。  

(2) 增强,增强算法将邻域咴度有显著变化的点突出显示。一般通过计算梯度 幅值完成。  (3) 检测,但在有些图像中梯度幅值较大的并不是边缘点。最简单的边缘检测 是梯度幅值阈值的判定。 

(4) 定位,精确确定边缘的位置。

        一般情况下,获得的边缘,会存在较大的缺口,这里,我们使用膨胀处理,修复边缘,膨胀原理如下所示:

假定二值图像A和形态学处理的结构元素B是定义在笛卡儿网格上的集合,网格中值为1的点是集合的元素,当结构元素的原点移到点(x,y)时,记为Sxy

膨胀是以得到B的相对与它自身原点的映像并且由z对映像进行移位为基础的。A被B膨胀是所有位移z的集合,这样, 和A至少有一个元素是重叠的。我们可以把上式改写为: 结构元素B可以看作一个卷积模板,区别在于膨胀是以集合运算为基础的,卷积是以算术运算为基础的,但两者的处理过程是相似的。

⑴ 用结构元素B,扫描图像A的每一个像素

⑵ 用结构元素与其覆盖的二值图像做“与”操作

⑶ 如果都为0,结果图像的该像素为0。否则为1

二、核心MATLAB程序

clc;
clear;
close all;
warning off;
addpath 'func\'

global xlag;
global CNT;
global frm;
global PEOPLE;
frm  = 1;
xlag = 0;
CNT  = 0;
PEOPLE    = 0;
START     = 150;
%读取视频
PIX       = VideoReader('test.avi');
PIX_Size  = [PIX.Width,PIX.Height];
Num_Frame = floor(PIX.Duration * PIX.FrameRate);
%参数初始化
for i = START:550
    PIX_each_frame = imresize(read(PIX,i),1/4);
    %1:预处理
    I0             = func_median(PIX_each_frame,5);
    %2:头部提取
    %边缘检测
    I1             = edge(I0,'canny');
    %边缘修复
    I2             = func_distancemap(I1);
    %轮廓检测,检测边缘中最接近圆的区域,头部定位
    [I3,L1]        = func_head_detection(I2,PIX_each_frame);
    figure(1);
    subplot(231);
    imshow(PIX_each_frame);
    title('原始视频');
    subplot(232);
    imshow(I0);
    title('中值滤波视频');    
    subplot(233);
    imshow(I1);
    title('边缘检测效果');       
    subplot(234);
    imshow(I3,[]);
    title('头部定位');  
    subplot(236);
    imshow(I3,[]);
    STR = ['第',num2str(i-START+1),'帧','共检测到',num2str(PEOPLE),'人'];
    title(STR,'Color','r','fontsize',15);
    drawnow;
end


三、MATLAB仿真测试结果

 

 

 

 A10-28