function lw_11
%矩形框定位+阴影检测
%对于highway的照片处理 阴影比较多的图像
%提取背景
m=70;
II=imread('highway1.jpeg');
II=rgb2gray(II);
%BW=zeros(size(II)); %BW将属于背景的像素相加
dc=zeros(size(II)); %累加器,累加背景出现的次数
%bj=zeros(size(II)); %背景
b=II; %初始化背景为第一帧图像
a=0.15;
[x,y]=size(II);N=x*y;
T=15; %帧间差分的阈值
tic
for i=1:5:m-1
%im1=sprintf('highwayII%d.jpeg',i);
%im1=imread(im1);
%I1=rgb2gray(im1);
for j=i:i+4 %每5帧为一组
im2=sprintf('highway%d.jpeg',j+1);
im2=imread(im2);
I2=rgb2gray(im2);
I=abs(double(b)-double(I2));
%TT=sum(sum(I))/N;
p=find(I>T); %小于阈值的为背景,大于阈值的为运动点
%p=find(I<T);
dc(p)=dc(p)+1; %累加器相加
q=find(dc==3); %积累5帧
if dc(q)==3
b(q)=a*I2(q)+(1-a)*b(q); %当前帧占少数,背景帧占大数
% figure,imshow(b);
% b(q)=(1-a)*I2(q)+a*b(q);
dc(q)=0;
end
end
end
toc
%figure,imshow(b);
b_g=b;
I=imread('highway25.jpeg');
I_g=rgb2gray(I);
figure,imshow(I_g);
D=abs(double(I_g)-double(b_g)); %背景差图像
%figure,imshow(uint8(D))
DD=zeros(size(D));
%采用动态阈值:
%t=30;u=2;
%tt=t+u*sum(sum(D))/N;
tt=40;
p=find(D>tt); %注意对于不同的图像门限是不同的,highway=35,highwayII=50.
DD(p)=1;
figure,imshow(DD);
se = strel('disk',3); %闭操作。
M=imclose(DD,se);
M=imfill(M,'hole');
figure,imshow(M);
I=double(I_g);
F=zeros(size(I));
g1=40;g2=75; %对于highwayg1=40;g2=73; highwayIIg1=25;g2=45;
p=find(M==1); %只对背景中车和背景处理,减少计算量。
F(p)=1./(1+exp(g1-I(p)))-1./(1+exp(g2-I(p)));
figure,imshow(F); %检测出来的阴影
FF=round(F); %用uint8 或round 一样。
p=find(FF==1);
M(p)=0;
figure,imshow(M);
%使运动目标进行闭合 (进行背景差的时候阈值T=40)
%先腐蚀->边缘->膨胀->填充->膨胀三次
se90=strel('line',3,90);se0=strel('line',3,0);
bwero=imerode(M,se90);%figure,imshow(bwero);
medge=edge(bwero,'sobel');%figure,imshow(medge);
MM=imdilate(medge,[se90 se0]);%figure,imshow(MM);
bwfil=imfill(MM,'holes');%figure,imshow(bwfil);
mdil1=imdilate(bwfil,[se90 se0]);%figure,imshow(mdil1);
mdil2=imdilate(mdil1,[se90 se0]);%figure,imshow(mdil2);
mdil3=imdilate(mdil2,[se90 se0]);figure,imshow(mdil3);
%标记->计算面积->去除小的面积区域->(重新标记)
[L,num] = bwlabel(mdil3,8);
stats = regionprops(L,'Area');
allArea = [stats.Area];
idx = find([stats.Area] > 300); %第30帧的时候700都可以
BW2 = ismember(L,idx);
figure,imshow(double(BW2));
[LL,NN] = bwlabel(BW2,8); %重新标记
figure,imshow(I_g);
for i=1:NN
[x,y]=find(LL==i);
left=min(y); right=max(y);
top=min(x); botton=max(x);
hold on
rectangle('Position',[left top right-left botton-top],'LineWidth',2);
end