clear
I=imread('e:\毕设\用于答辩、报告、实验数据保存\保存图像\下载2\原始图像\原始图像15.jpg'); % 读入第一帧作为背景帧
fr_bw = I;
[height,width] = size(fr_bw); %求每帧图像大小
fg = zeros(height, width); %定义前景和背景矩阵
bg_bw = zeros(height, width);
C = 3; % 单高斯模型的个数(通常为3-5)
M = 2; % 代表背景的模型个数
D1 = 2.5; % 偏差阈值
D2 = 1.5; % 偏差阈值
alpha = 0.04; % 学习率
thresh = 0.2; % 前景阈值
sd_init = 6; % 初始化标准差
w = zeros(height,width,C); % 初始化权重矩阵
mean = zeros(height,width,C); % 像素均值
sd = zeros(height,width,C); % 像素标准差
u_diff = zeros(height,width,C); % 像素与某个高斯模型均值的绝对距离
p = alpha/(1/C); % 初始化p变量,用来更新均值和标准差
rank = zeros(1,C); %各个高斯分布的优先级(w/sd)
Match=zeros(height,width,C);
pixel_depth = 8; % 每个像素8bit分辨率
pixel_range = 2^pixel_depth -1; % 像素值范围[0,255]
for i=1:height
for j=1:width
for k=1:C
if(k==1)
mean(i,j,k) = double(fr_bw(i,j)); %初始化第k个高斯分布的均值
w(i,j,k) = 0.5; % 初始化第k个高斯分布的权重
sd(i,j,k) = sd_init;
else
mean(i,j,k) = 0.25; %初始化第k个高斯分布的均值
w(i,j,k) = 0.2; % 初始化第k个高斯分布的权重
sd(i,j,k) = sd_init; % 初始化第k个高斯分布的标准差
end
end
end
end
frame_num=77;%帧数
for N = 15:frame_num
if(N>30)
alpha = 0.02; % 减小学习率
end
filename=[strcat('e:\毕设\用于答辩、报告、实验数据保存\保存图像\下载2\原始图像\',strcat('原始图像',int2str(N))),'.jpg'];
I1=imread(filename, 'jpg'); % 依次读入各帧图像
fr_bw =I1;
% 计算新像素与第m个高斯模型均值的绝对距离
for m=1:C
u_diff(:,:,m) = abs(double(fr_bw) - double(mean(:,:,m)));
end
% 更新高斯模型的参数
for i=1:height
for j=1:width
match = 0; %匹配标记;
for k=1:C
if (abs(u_diff(i,j,k)) <= D1*sd(i,j,k)) % 像素与第k个高斯模型匹配
match = 1; %将匹配标记置为1
% 更新权重、均值、标准差、p
Match(i,j,k)=1;
w(i,j,k) = (1-alpha)*w(i,j,k) + alpha;
p = alpha/w(i,j,k);
mean(i,j,k) = (1-p)*mean(i,j,k) + p*double(fr_bw(i,j));
sd(i,j,k) = sqrt((1-p)*(sd(i,j,k)^2) + p*((double(fr_bw(i,j)) - mean(i,j,k)))^2);
else % 像素与第k个高斯模型不匹配
w(i,j,k) = (1-alpha)*w(i,j,k); %略微减少权重
Match(i,j,k)=0;
end
end
% 像素值与任一高斯模型都不匹配,则创建新的模型
if (match == 0)
[min_w, min_w_index] = min(w(i,j,:)); %寻找最小权重
w(i,j,rank_ind(C))=w(i,j,min_w_index);
mean(i,j,rank_ind(C)) = double(fr_bw(i,j));%初始化均值为当前观测像素的均值
sd(i,j,rank_ind(C)) = sd_init; %初始化标准差为6
end
num=0;
for k=1:C
num = num+ w(i,j,k);
end
w(i,j,:) = w(i,j,:)/num;
rank = w(i,j,:)./sd(i,j,:); % 计算模型优先级
rank_ind = [1:1:C];%优先级索引
for m=1:C
for n=m:C
if(rank(m)<rank(n))
temp=rank_ind(n);
rank_ind(n)=rank_ind(m);
rank_ind(m)=temp;
end
end
end
W_total=0;
for k=1:C
W_total=W_total+w(i,j,rank_ind(k));
if(W_total>0.5)
M=k;
break;
end
end
bg_bw(i,j)=0;
for k=1:M
bg_bw(i,j) = bg_bw(i,j)+(mean(i,j,rank_ind(k))*w(i,j,rank_ind(k))/W_total);
end
fg(i,j)=abs(double(fr_bw(i,j))-double(bg_bw(i,j)));
end
end
bg_bw=uint8(bg_bw);
fg=uint8(fg);
subplot(1,3,1)
imshow(fr_bw);
title('原始图像');
subplot(1,3,2)
imshow(bg_bw);
title('高斯背景');
subplot(1,3,3)
imshow(fg);
title('飞机目标');
drawnow;
imwrite(bg_bw,strcat('e:\毕设\用于答辩、报告、实验数据保存\保存图像\下载2\高斯建模\高斯背景15\改进\','高斯背景',int2str(N),'.jpg'));
imwrite(fg,strcat('e:\毕设\用于答辩、报告、实验数据保存\保存图像\下载2\高斯建模\高斯检测15\改进\','高斯背景建模检测',int2str(N),'.jpg'));
end
clear all
figure
for i=15:77
filename1 = strcat('e:\毕设\用于答辩、报告、实验数据保存\保存图像\下载2\原始图像\','原始图像',int2str(i),'.jpg');%读取文件
filename2 = strcat('e:\毕设\用于答辩、报告、实验数据保存\保存图像\下载2\高斯建模\高斯检测15\改进\','高斯背景建模检测',int2str(i),'.jpg');
fg= imread(filename1);
f = imread(filename2); %读取图像
f=im2bw(f,0.15); %二值化
imshow(f); %显示当前帧
[rows,cols]=size(f); %图像大小
cou=1; %上下边界标志
toplen=260;
tpln=0;
leftsi=556;
lftln=0;
hold on %画网格
for h=1:rows
for w=1:cols
if(f(h,w)>0.5) %飞机区域
toplen = h; %更新边界
if (cou == 1) %是上边界
tpln=toplen; %记录上边界纵坐标
cou=0; %已记录上边界
end
end
end
end
coun=1; %左右边界标志
for w=1:cols
for h=1:rows
if(f(h,w)>0.5) %飞机区域
leftsi = w; %更新边界
if (coun == 1) %是左边界
lftln=leftsi; %记录左边界横坐标
coun=0; %已记录左边界
end
end
end
end
widh=leftsi-lftln; %飞机区域宽度
heig=toplen-tpln; %飞机区域高度
widt=widh/2;
heit=heig/2;
with=lftln+widt; %飞机中心点横坐标
heth=tpln+heit; %飞机中心点纵坐标
rectangle('Position',[lftln tpln widh heig],'EdgeColor','r'); %飞机画矩形框
plot(with,heth, 'r*'); %标记飞机中心点
saveas(gcf,strcat('e:\毕设\用于答辩、报告、实验数据保存\保存图像\下载2\高斯建模\高斯检测画框15\改进\','高斯画框',int2str(i),'.jpg'));
imshow(fg);
rectangle('Position',[lftln tpln widh heig],'EdgeColor','r'); %飞机画矩形框
plot(with,heth, 'r*'); %标记飞机中心点
saveas(gcf,strcat('e:\毕设\用于答辩、报告、实验数据保存\保存图像\下载2\高斯建模\原始图像高斯画框15\改进\','原始图像高斯画框',int2str(i),'.jpg'));
drawnow; %刷新屏幕
hold off %去除网格
end;