clc
clear
load jb1;
load jb2;
[nx,ny]=size(c1);
counter=zeros(nx,ny);
for i=1:nx
for j=1:ny
if abs(c1(i,j)-c2(i,j))<15
counter(i,j)=1;
else
counter(i,j)=2;
end
end
end
h_b(1,1)=(c1(1,1)+c2(1,1))/2;
h_o(1,1)=(c1(1,1)+c2(1,1))/2;
flag(1,1)=0;
% flag_i=0;%表示处于背景
% flag=flag_i;
for i=1:nx
%%%%%%%%%%%%%判断每一行第一个点是?%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if i~=1 & counter(i,1)==1 %说明此行的第一个点是在平坦区
h_b(i,1)=(c1(i,1)+c2(i,1))/2;
h_o(i,1)=(c1(i,1)+c2(i,1))/2;
if flag(i-1,1)==1
%%%%%%%%%%%%%%%%%%%%%%%%%%修改%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% if abs(abs(h_o(i,1)-h_o(i-1,1))-abs(h_b(i,1)-h_b(i-1,1)))<15%%说明此点是背景点还是目标点有待判决,一般是做为目标点
% flag(i,1)=2;
% else
if abs(h_o(i,1)-h_o(i-1,1))<abs(h_b(i,1)-h_b(i-1,1))
flag(i,1)=2;
% flag_i=2;%为目标点
% flag=flag_i;
else
flag(i,1)=0;
% flag_i=0;%为背景点
% flag=flag_i;
end
% end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
else
flag(i,1)=flag(i-1,1);
end
elseif i~=1 & counter(i,1)==2 %说明此行的第一个点是在边界区
if flag(i-1,1)==0%h_b(i-1,1)=h_o(i-1,1)上一点是背景点
if abs(c1(i,1)-h_b(i-1,1))<abs(c2(i,1)-h_b(i-1,1))
h_b(i,1)=c1(i,1);
h_o(i,1)=c2(i,1);
else
h_o(i,1)=c1(i,1);
h_b(i,1)=c2(i,1);
end
elseif flag(i-1,1)==2%h_b(i-1,1)=h_o(i-1,1)上一点是目标点
if abs(c1(i,1)-h_o(i-1,1))<abs(c2(i,1)-h_o(i-1,1))
h_o(i,1)=c1(i,1);
h_b(i,1)=c2(i,1);
else
h_b(i,1)=c1(i,1);
h_o(i,1)=c2(i,1);
end
elseif flag(i-1,1)==1%上一点也是边界点
%%%%%%%%%%%%%%%%%%%%%%%%%%修改:应该使得背景和目标都不会出现大幅变化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
F=[abs(c1(i,1)-h_b(i-1,1)) abs(c2(i,1)-h_b(i-1,1)) abs(c1(i,1)-h_o(i-1,1)) abs(c2(i,1)-h_o(i-1,1))];
[y,ind]=min(F);
if ind==1 || ind==4
h_b(i,1)=c1(i,1);
h_o(i,1)=c2(i,1);
else
h_b(i,1)=c2(i,1);
h_o(i,1)=c1(i,1);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
end
flag(i,1)=1;
% flag_i=1;%表示此点是边界点
% flag=flag_i;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for j=2:ny
if counter(i,j)==1%此点在平坦区
h_b(i,j)=(c1(i,j)+c2(i,j))/2;
h_o(i,j)=(c1(i,j)+c2(i,j))/2;
if flag(i,j-1)==1
%%%%%%%%%%%%%%%%%%%%%%%%%修改%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% if abs(abs(h_o(i,j)-h_o(i,j-1))-abs(h_b(i,j)-h_b(i,j-1)))<15%%说明此点是背景点还是目标点有待判决,但是一般是将其当做目标点
% flag(i,j)=2;
% else
if abs(h_o(i,j)-h_o(i,j-1))<abs(h_b(i,j)-h_b(i,j-1))
flag(i,j)=2;%为目标点
else
flag(i,j)=0;%为背景点
end
% end
else
flag(i,j)=flag(i,j-1);
end
elseif counter(i,j)==2%此点在边界区
if flag(i,j-1)==0%前一点为背景点
if abs(c1(i,j)-h_b(i,j-1))<abs(c2(i,j)-h_b(i,j-1))
h_b(i,j)=c1(i,j);
h_o(i,j)=c2(i,j);
else
h_o(i,j)=c1(i,j);
h_b(i,j)=c2(i,j);
end
elseif flag(i,j-1)==2%前一点为目标点
if abs(c1(i,j)-h_o(i,j-1))<abs(c2(i,j)-h_o(i,j-1))
h_o(i,j)=c1(i,j);
h_b(i,j)=c2(i,j);
else
h_b(i,j)=c1(i,j);
h_o(i,j)=c2(i,j);
end
elseif flag(i,j-1)==1%前一点也为边界点
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%修改:一般保证都是小幅变化%%%%%%%%%%%%%%%%%%%%%%
F=[abs(c1(i,j)-h_b(i,j-1)) abs(c2(i,j)-h_b(i,j-1)) abs(c1(i,j)-h_o(i,j-1)) abs(c2(i,j)-h_o(i,j-1))];
[y0,ind0]=max(F);
[y,ind]=min(F);
F_min=F(ind);%最小值
F(ind)=255;
[y1,ind1]=min(F);%次小值
if abs(F(ind1)-F_min)>15%以最小值为准
if ind==1 || ind==4
h_b(i,j)=c1(i,j);
h_o(i,j)=c2(i,j);
elseif ind==2 || ind==3
h_b(i,j)=c2(i,j);
h_o(i,j)=c1(i,j);
end
else%以最大值为准
if ind0==1 || ind0==4
h_b(i,j)=c2(i,j);
h_o(i,j)=c1(i,j);
elseif ind0==2 || ind0==3
h_b(i,j)=c1(i,j);
h_o(i,j)=c2(i,j);
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% [y,ind]=min(F);
% if ind==1 || ind==4
% h_b(i,j)=c1(i,j);
% h_o(i,j)=c2(i,j);
% else
% h_b(i,j)=c2(i,j);
% h_o(i,j)=c1(i,j);
% end
end
flag(i,j)=1;%此点为边界点
end
end
end
figure(1)
subplot(1,2,1);imshow(uint8(c1));
subplot(1,2,2);imshow(uint8(c2));
figure(2)
subplot(1,2,1);imshow(uint8(h_o));
subplot(1,2,2);imshow(uint8(h_b));