clc,clear;
% 读入视频文件到pixels
video = 'data.avi';
avi = aviread(video);
pixels = double(cat(4,avi(1:2:end).cdata)) / 255;
clear avi;
% 读取第一帧图片和最后一帧图片做差分,得到运动目标
% 因为第一帧和最后一帧目标互不重叠,所以暂时这样用
[d1 d2 d3 d4] = size(pixels);
p1 = pixels(:,:,:,1);
p2 = pixels(:,:,:,d4);
% 彩色差分
d = imabsdiff(p2, p1);
figure
imshow(d)
bw = im2bw(d, 0.05);
imshow(bw)
% 灰度差分
gp1 = (rgb2gray(p1));
gp2 = (rgb2gray(p2));
gd = imabsdiff(gp2, gp1);
figure
imshow(gd)
gbw = im2bw(gd, 0.05);
imshow(gbw)
% 使用膨胀和腐蚀的组合消除噪点
% 开运算和闭运算组合能非常有效的消除噪声
se = strel('disk', 3);
obw = imopen(bw, se);
cbw = imclose(obw, se);
figure
imshow(cbw);
% 使用中值滤波去除噪声
mbw = medfilt2(bw, [11 11]);
figure
imshow(mbw);
%使用BW图像在原图中提取出目标
[label, num] = bwlabel(mbw); % 标记连通区域
imshow(label2rgb(label)); % 按不同颜色显示连同区域
%设定阈值 保留目标
sbw = bwselect(mbw); % 使用bwselect选择需要连通区域,双击得到
imshow(sbw);
% 在此例选择了最后一帧的目标连通区,然后使用sbw和p2得到目标
obj(:, :, 1) = p2(:, :, 1) .* sbw;
obj(:, :, 2) = p2(:, :, 2) .* sbw;
obj(:, :, 3) = p2(:, :, 3) .* sbw;
imshow(obj);
。。。
最新推荐文章于 2024-01-21 11:06:40 发布