----WORD 格式 --可编辑 ----
%直接帧间差分,计算阈值并进行二值化处理(效果不好)
clc;
clear;
Im1 = double(imread('lena.TIF'));
Im2 = double(imread('lena.TIF');
%读取背景图片
% 读取当前图片
[X Y Z] = size(Im2);
DIma = zeros(X,Y);
for i = 1:X
for j = 1:Y
%当前图片的各维度值
DIma(i,j) =Im1(i,j) - Im2(i,j);
% 计算过帧间差分值
end
end
figure,imshow(uint8(DIma))
%显示差分图像
title('DIma')
med = median(DIma);
%计算二值化阈值:差值图像中值
mad = abs(mean(DIma) - med);
%中值绝对差
T = mean(med + 3*1.4826*mad)
Th =5*T;
BW = DIma <= Th;
figure,imshow(BW)
%初始阈值
%调整阈值
% 根据阈值对图像进行二值化处理
%se = strel('disk',2);
%膨胀处理
%BW = imopen(BW,se);
%figure,imshow(BW)
%title('BW')
[XX YY] = find(BW==0);
handle = rectangle('Position',[min(YY),min(XX) ,max(YY)-min(YY),max(XX)-min(XX)]);
%寻找有效像素点的最大边框
set(handle,'EdgeColor',[0 0 0]);
hei = max(XX)-min(XX);
%边框高度
mark = min(YY)+1;
while mark < max(YY)-1
%从边框左边开始到右边物质循环,寻找各个人体边缘
left = 0;right = 0;
for j = mark:max(YY)-1
ynum = 0;
for i = min(XX)+1 : max(XX)-1
if BW(i,j) == 0;
ynum = ynum + 1;
----
----WORD 格式 --可编辑 ----
end
end
if ynum > 0.1*hei
% 如果该列上像素点个数大于边框高度的某个阈值
left = j
mark = j;
break
end
end
if left~= 0
% 认为找到了左边界
% 如果找到了左边界
for j = left+1 : max(YY)-1
%则从左边界到边框右边界寻找人体右边界
ynum = 0;
for i = min(XX)+1 : max(XX)-1
if BW(i,j) == 0;
ynum = ynum + 1;
阈值
end
end
if ynum < 0.1*hei
right= j
mark = j;
break
end
end
if left~=right
界,继续以左右边界为界寻找上下边界
%如果该列上像素点个数小于边框高度的某个
% 认为找到了左边界
%如果左右边界值不相等, 即同时找到了左右边
[top,bottom] = Find_edge(BW,min(XX)+1,max(XX),left,right,0.1);
handle = rectangle('Position',[left,top,right-left,bottom-top]);
set(handle,'EdgeColor',[0 0 0]);
%显示图像中人体有效边界
end
end
mark = mark + 1;
end
% while
----