运动历史图MHI——程序解析(超详细)

% 获取视频
video = VideoReader('PS7A2P1T1.avi');
% 得到视频帧数
numFrames = video.NumberOfFrames;

%构建结构体,包括两个域cdata数据(返回一个视频高度X视频宽度的三维0矩阵,类型为uint8)和colormap颜色(默认)
frames(1:numFrames) = struct('cdata', zeros(video.Height, video.Width, 3, 'uint8'),'colormap', []);
binary = zeros(video.Height, video.Width,numFrames-1);%返回视频高度X宽度的numframes-1维0矩阵
mhi = zeros(video.Height, video.Width,numFrames-1);%同上
f = fspecial('gaussian', [4 4], 10); %用 fspecial生成的一个标准差为10,大小为4*4的高斯模板矩阵用于下面的imfilter滤波操作

for k = 1 : numFrames
%灰度化后的每帧图像作为输入,f作为滤波模板,边界选项为replicate
    frames(k).cdata = imfilter(rgb2gray(read(video, k)),f,'replicate');
end

t = 0.15;%差异阈值,变大,背景噪声消失,但过大会导致运动区域中心出现空洞

for i = 2:numFrames
    diff = frames(i).cdata-frames(i-1).cdata;
    binary(:,:,i-1) = (im2bw(diff,t));%im2bw将灰度图像diff转化为二进制图像,阈值等级为t=0.15
    mhi(:,:,i) = 60*binary(:,:,i-1);
    
    for j = 1:video.height
        for k = 1:video.width
            if(mhi(j,k,i)==0)
                mhi(j,k,i)=max(0,mhi(j,k,i-1)-2);   %δ = 2,δ变大,较早发生运动的部分消除得更多
            end
        end
        
    end
    
end

implay(mhi)

matlab中的几个函数解析
1.struct
struct在matlab中是用来建立结构体数组的。通常有两种用法:
s = struct(‘field1’,{},‘field2’,{},…)%建立一个空的结构体,field1,field2是域名称
s = struct(‘field1’,values1,‘field2’,values2,…)
%在建立结构体的时候就赋值,values1,values2就是针对field1,field2所赋的值

例如:s = struct(‘type’,{‘big’,‘little’},‘color’,{‘red’},‘x’,{3 4})
这个结构体有三个域’type’,‘color’,‘x’,根据英文意义可以看出分别是类型,颜色和值的意思。类型可以取的值有’big’,‘little’,也就是类型有两种,分别是大和小。颜色只有’red’红色,而值x可以是3或者4
2.zeros
zeros(n) %返回一个n x n的零矩阵,如果n不是一个标量,将抛出错误
zeros(m,n) 或 zeros([m n]) %返回一个m x n的零矩阵
zeros(d1,d2,d3…) 或 zeros([d1 d2 d3…])
zeros(size(A)) %返回一个和A一样大小的零数组
zeros(m, n,…,classname) 或 zeros([m,n,…],classname) %返回一个类型为classname的m x n x…零数组
classname可以是:double’, ‘single’, ‘int8’, ‘uint8’, ‘int16’, ‘uint16’, ‘int32’, or ‘uint32’
3.fspecial
Fspecial函数用于创建预定义的滤波算子,其语法格式为:
h = fspecial(type)
h = fspecial(type,parameters,sigma)
参数type制定算子类型,parameters指定相应的参数,具体格式为:
type=‘average’,为均值滤波,参数为n,代表模版尺寸,用向量表示,默认值为[3,3]。
type= ‘gaussian’,为高斯低通滤波器,参数有两个,n表示模版尺寸,默认值为[3,3],sigma表示滤波器的标准差,单位为像素,默认值为 0.5。
type= ‘laplacian’,为拉普拉斯算子,参数为alpha,用于控制拉普拉斯算子的形状,取值范围为[0,1],默认值为0.2。
type= ‘log’,为拉普拉斯高斯算子,参数有两个,n表示模版尺寸,默认值为[3,3],sigma为滤波器的标准差,单位为像素,默认值为0.5
type= ‘prewitt’,为prewitt算子,用于边缘增强,无参数。
type= ‘sobel’,为著名的sobel算子,用于边缘提取,无参数。
type= ‘unsharp’,为对比度增强滤波器,参数alpha用于控制滤波器的形状,范围为[0,1],默认值为0.2。
4.rgb2gray
rgb2gray是matlab内部一种处理图像的函数,通过消除图像色调和饱和度信息同时保留亮度实现将将RGB图像或彩色图转换为灰度图像,即灰度化处理的功能
5.imfilter
语法:g=imfilter(f,w,filtering_mode,boundary_options,size_optinos)
功能:对任意类型数组或多维图像进行滤波
参数:f是输入图像,w为滤波模板,g为滤波结果
运动历史图MHI——程序解析(超详细)_第1张图片

你可能感兴趣的:(运动历史图MHI——程序解析(超详细))