MATLAB EM2D 算法


function e2md = e2md( input_args )
%——————本函数输入一灰度图象,输出该图象的2维EMD结果imf1 imf2 im3
%——————二维插值use Delaunay triangulation and then cubic interpolation
%——————input_args为图象路径
[X,map]=imread(input_args);
%X为原始图象 XMAX为极大值图象,非极大值处值为0 XMIN 为极小值图象,非极小值处值为255

C=double(X);

X=double(X);
x_widthtrue=size(X,1);
%-----复制图象,延拓100行(列)
%---上下各做延拓
for i=1:100
    X=[X(2*i+1,:);X];
end
for i=1:100
    X=[X;X(x_widthtrue+101-i,:)];
end
%---上下延拓完毕,将做左右延拓
for i=1:100
    X=[X(:,2*i+1),X];
end
for i=1:100
    X=[X,X(:,x_widthtrue+101-i)];
end
%---上下延拓完毕
%-----复制图象

I=X;
      %I描述原图象的双精度形式
orig=X;
orig=double(orig);
      %orig描述原图象的双精度形式,用来在筛分结束的时候表示残差
%————————————————————————————————
x_width=size(X,1); 
      %x_width表示延拓之后图象的大小(长=宽)
%***************************************************************
for imfcount=1:3%for#01
             % NL=NL_num+imfcount^2;
              X=orig;
              count=0;
              SD=100;%SD初始化
while(SD>0.3)%while#01
%————————————————————————搜索极值:1——————
%————————建立极值图象 极大值图象XMAX 极小值图象XMIN—————
XMAX=X;
XMAX=X;
%————————End:建立极值图象 极大值图象XMAX 极小值图象XMIN———
count=count+1;
xl_max=[];
          %极大值3行matrix,第一二三行分别为行数列数和灰度值
xl_min=[];
          %极小值3行matrix,第一二三行分别为行数列数和灰度值
          %这样有利于构造包络
for i=2:x_width-1
    for j=2:x_width-1
        if(X(i,j)>X(i-1,j))&(X(i,j)>X(i+1,j))&(X(i,j)>X(i-1,j+1))&(X(i,j)>X(i+1,j+1))&(X(i,j)>X(i,j+1))&(X(i,j)>X(i-1,j-1))&(X(i,j)>X(i+1,j-1))&(X(i,j)>X(i,j-1))
            XMAX(i,j)=X(i,j);
        else
            XMAX(i,j)=-500;
        end
        if(X(i,j)<X(i-1,j))&(X(i,j)<X(i+1,j))&(X(i,j)< X(i-1,j+1))&(X(i,j)<X(i+1,j+1))&(X(i,j)<X(i,j+1))&(X(i,j)<X(i-1,j-1))&(X(i,j)<X(i+1,j-1))&(X(i,j)<X(i,j-1))
            XMIN(i,j)=X(i,j);
        else
            XMIN(i,j)=500;
        end
    end
end

for i=2:x_width-1
    for j=2:x_width-1
        if(XMAX(i,j)~=-500)
            xl_max=[xl_max,[i;j;X(i,j)]];
        end
        if(XMIN(i,j)~=500)
            xl_min=[xl_min,[i;j;X(i,j)]];
        end
    end
end
%——————————————————————End:搜索极值:2——————
%————————————————End:用NL的值来进行极值的筛选————

%——————————————————————构造上下包络——————
x=xl_max(1,:);
y=xl_max(2,:);
z=xl_max(3,:);
ti=1:1:x_width;
[xi yi]=meshgrid(ti,ti);
zi_max=griddata(y,x,z,xi,yi,'cubic');
            %对极大值点进行插值
            %x,y为极值点的坐标,z为该处灰度的值,
            %zi显示插值结果,是一个width*width 的matrix
x=xl_min(1,:);
y=xl_min(2,:);
z=xl_min(3,:);
ti=1:1:x_width;
[xi yi]=meshgrid(ti,ti);
zi_min=griddata(y,x,z,xi,yi,'cubic');
            %对极大值点进行插值
            %x,y为极值点的坐标,z为该处灰度的值,
            %zi显示插值结果,是一个width*width 的matrix
%————————————————————End:构造上下包络——————
zi=(zi_max+zi_min)/2;
            %求得均值包络
SD=max(abs(zi(101:x_widthtrue+100,101:x_widthtrue+100)))/max(abs(orig(101:x_widthtrue+100,101:x_widthtrue+100)));
X=X-zi;     %将图象减去均值包络
end%while#01减均值的过程
imf=X;
if(imfcount==1)
    imf1=imf(101:x_widthtrue+100,101:x_widthtrue+100);
    else if (imfcount==2)
    imf2=imf(101:x_widthtrue+100,101:x_widthtrue+100);
    else if(imfcount==3)
        imf3=imf(101:x_widthtrue+100,101:x_widthtrue+100);
        else if(imfcount==4)
                imf4=imf(101:x_widthtrue+100,101:x_widthtrue+100);
            else
                imf5=imf(101:x_widthtrue+100,101:x_widthtrue+100);
            end
        end
    end
end
orig=orig-imf;
end%for#01得到IMF个数
%————————————————以上得到IMF1和IMF2
%********************************************************************
%★★★★★在这里设置breakpoint可以得到imf1、imf2、orig(残差)★★★★★★




function isitn = isitn( input_args2,isitn_n )
%判断input_args2中的值是否全为isitn_n,是则返回0,否则返回1
isitn=0;
size_input_args2=size(input_args2,1);
for i_isitn=1:size_input_args2
    for j_isitn=1:size_input_args2
        if (input_args2(i_isitn,j_isitn)~=isitn_n)&(i_isitn~=(floor(size_input_args2/2)+1))&(j_isitn~=(floor(size_input_args2/2)+1))
            isitn=1;
        end
    end
end



function puguji=puguji(fxxm,m)
%p为阶数,初始化为原始数据列的列数
%m表示向后预测的数据的个数
%fxxm为原始信号
p=size(fxxm,2);
for j=1:m%m表示向后预测m个
    a=lpc(fxxm,p+j-1);
    fxxm(p+j)=0;
    for i=1:(p+j-1)
        fxxm(p+j)=fxxm(p+j)-fxxm(p-i+j)*a(i+1);
    end
end
puguji=fxxm;

function puguji2=puguji2(fxxm,m)
%p为阶数,初始化为原始数据列的列数
%m表示向后预测的数据的个数
%fxxm为原始信号
p=size(fxxm,2);
fxxm=fxxm(end:-1:1);
for j=1:m%m表示向后预测m个
    a=lpc(fxxm,p+j-1);
    fxxm(p+j)=0;
    for i=1:(p+j-1)
        fxxm(p+j)=fxxm(p+j)-fxxm(p-i+j)*a(i+1);
    end
end
fxxm=fxxm(end:-1:1);
puguji2=fxxm;



你可能感兴趣的:(MATLAB EM2D 算法)