gusucode.com > 红外图像增强及目标检测演示界面matlab源码程序 > code/WaveFisherImSg.m

    function WaveFisherImSg
%主要适用于斑点目标图像
  H=msgbox('主要适用于斑点目标图像');waitfor(H);
  I0=U_Open; 
  if (I0==0) H=errordlg('图像打开失败');waitfor(H);break; end
  label=inputdlg('若图像为暗目标图像,请输入0,否则输入1','图像类型标志',1,{'0'});
  label=str2num(char(label));
  if isrgb(I0)  I0=rgb2gray(I0);end
  [row col]=size(I0);
  if(label==1)%图像为天空背景弱小亮点目标图像,图像带边匡
     I=im2double(I0(30:row-35,45:col-44));
     I0=I;
  elseif(label==0)%图像为海空背景下的斑点目标图像,目标较背景暗
       I0=im2double(I0(10:row-20,10:col-10));
       m=max(I0(:));
       I=m-I0;
   else
      errordlg('输入图像类型错误');break;
   end
 tic
  [c1,s1]=wavedec2(I,4,'db2');
  sz=s1(1,:);%size of app. coef.(N=4)
  c1(1:sz(1)*sz(2))=0;%令低频部分为0
  f1=waverec2(c1,s1,'db2');%得到主要包含高频信息的图像
  f1=f1.*(f1>0);
  f1=medfilt2(f1);
   h=histog(f1);
   [sgf,Tf]=FisherSg(f1,h);
   [psgf,px,py]=ImPostProcess(sgf,label);
 [sgb,Tb]=BtwClsVarImSg(I);
 H=msgbox(['Fiser分割阈值',num2str(Tf)]);waitfor(H)
 H=msgbox(['内间方差分割阈值',num2str(Tb)]); waitfor(H)
figure
subplot(2,2,1);
imshow(I)
title('原图像')
d=10;
hold on;
   plot([py-d py+d],[px-d px-d],'w');
   plot([py-d py+d],[px+d px+d],'w');
   plot([py-d py-d],[px-d px+d],'w');
   plot([py+d py+d],[px-d px+d],'w');
hold off;
subplot(2,2,2);
imshow(sgf*0.9);
title('Fiser分割图像')
subplot(2,2,3);
imshow(psgf);
title('Fiser分割后处理图像')
subplot(2,2,4);
imshow(sgb);
title('内间方差分割图像')
msgbox(['所用时间',num2str(toc),'秒']);
%=============================================================
 function h=histog(f)
 %计算直方图
   m=max(f(:));
  f=round(f*255/m);
 [row col]=size(f);
 h=zeros(1,256);
 p=1/(row*col);
 for x=1:row
     for y=1:col
         i=f(x,y)+1;
         if(i>256)
             i=256;
         end
         h(i)=h(i)+p;
     end
 end
 %=============================================================
 function [sgf,T]=FisherSg(f,h)
%sgf为目标提取结果图像,亮点为目标,px,py为目标质心
%假定目标为亮点目标时的情况,暗点目标先运行:f=max(f(:))-f; 
m=max(f(:));
f=round(f*255/m);
D=zeros(256,256);
for i=1:255
  for j=(i+1):256
       m=0;
      for l=i:j
        m=m+h(l);
       end
      m=m/(j-i+1);
      for l=i:j
         %D(i,j)=D(i,j)+(h(l)-m)^2;
         D(i,j)=D(i,j)+abs(h(l)-m);
       end
      D(j,i)=D(i,j);
   end
end
code=zeros(256,256);
ep=code;
for n=3:256
      ep(n,2)=10000;code(n,2)=2;
      d=0;
       for j=2:n
           d=D(1,j-1)+D(j,n);
           if(d<ep(n,2))
               ep(n,2)=d;
               code(n,2)=j;
           end
       end
  end
for k=3:10
    for n=k+1:256                     
        ep(n,k)=100000;code(n,k)=2;
        d=0.0;
        for j=k:n
            d=ep(j-1,k-1)+D(j,n);
            if(d<ep(n,k))
               ep(n,k)=d;
               code(n,k)=j;
           end
       end
   end
end

class=2;a1=0.0;a2=.0;a=0.0;
 for i=3:8
     a1=atan(ep(256,i)-ep(256,i-1));
     a2=atan(ep(256,i+1)-ep(256,i));
     if(abs(a1-a2)>a)
         a=abs(a1-a2);class=i+1;
     end
 end
% class=class+1;
 T=code(256,class)-1;% 分割阈值
sgf=f>=T;%阈值分割——目标提取

%=========================================
function [f,px,py]=ImPostProcess(sgf,L)
if(L==1)
      for i=1:10 
        sgf=bwmorph(sgf,'dilate',1);
        sgf=bwmorph(sgf,'erode',1);
      end
     sgf=bwmorph(sgf,'erode',1);
     sgf=bwmorph(sgf,'dilate',1);
     sgf=im2double(sgf);
else
     for i=1:10 
         sgf=bwmorph(sgf,'erode',1);
         sgf=bwmorph(sgf,'dilate',1);
     end
     sgf=bwmorph(sgf,'erode',2);
     sgf=bwmorph(sgf,'dilate',1);
     sgf=im2double(sgf);
end
 [row col]=size(sgf);
 f=sgf;
 px=0;py=0;m=0;
 for i=1:row %目标质新计算
     for j=1:col
         if(sgf(i,j)~=0)
             px=px+i;
             py=py+j;
             m=m+1;
         end
     end
 end
 if(m~=0)
     px=px/m;
     py=py/m;
 end