MHI

本文介绍使用Matlab实现运动历史图像(MHI)的代码,通过处理视频帧生成具有灰度变化的动作图。文章详细展示了代码流程,包括视频读取、灰度化、滤波、二值化及MHI更新等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章记录一些关于matlab的MHI代码,实我同学发给我让我瞅瞅的

MHI是啥我就不说了,有兴趣可以参考下面的文章。

https://blog.youkuaiyun.com/m0_37692953/article/details/81585552

然后主要是要生成一个有灰度变化的动作图

看起来很酷炫的那种

下面的部分是我同学发给我的,估计也是从网上找的代码,但是也很好理解

我找不到这个代码源地址,如果作者看到了不愿意随时联系我删除

% 获取视频
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代码咋插入。。就这样吧

它的显示结果不是很好,一个是不分明,另外是灰度没有变化。

其实改的很简单,加两个uint8就行了

imshow(uint8(mhi(:, :, numFrames)))
implay(uint8(mhi))

简单来说就是,原来是double类型的,imshow()只能显示两种格式,一种是uint8一种是double,如果显示出来是个二值图像,没有灰度变化,说明是按double来show的

所以加个imshow(unit8(balabal))

嗯,学到的就是这些

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值