⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pmain2.m

📁 主要用于图像识别中
💻 M
字号:

% pmain
% get all the models

mod1=wwx([997,1093,2012,2080]);
mod2=wwx([1729,1824,2259,2326]);
mod3=wwx([1289,1386,2750,2819]);
mod4=wwx([1876,1970,2786,2853]);
mod5=wwx([2021,2117,3031,3098]);
mod6=wwx([2314,2409,2541,2606]);
mod7=wwx([2168,2263,2669,2734]);
mod8=wwx([2022,2118,1815,1882]);
mod9=wwx([3190,3288,2128,2209]);
mod10=wwx([3629,3726,1392,1472]);
mod11=wwx([3336,3433,2538,2618]);

modstr(1).va=edge(mod1,'canny');
modstr(1).na=1;
modstr(2).va=edge(mod2,'canny');
modstr(2).na=2;
modstr(3).va=edge(mod3,'canny');
modstr(3).na=3;
modstr(4).va=edge(mod4,'canny');
modstr(4).na=1;
modstr(5).va=edge(mod5,'canny');
modstr(5).na=5;
modstr(6).va=edge(mod6,'canny');
modstr(6).na=6;
modstr(7).va=edge(mod7,'canny');
modstr(7).na=7;
modstr(8).va=edge(mod8,'canny');
modstr(8).na=8;
modstr(9).va=edge(mod9,'canny');
modstr(9).na=9;
modstr(10).va=edge(mod10,'canny');
modstr(10).na=10;
modstr(11).va=edge(mod11,'canny');
modstr(11).na=11;

xx=length(modstr);
sse=strel('square',3);
ccov=zeros(xx,xx);
for ii=1:xx-1
    a=modstr(ii).va;
    [ma,na]=size(a);
    ac=imdilate(a,sse);
    for jj=ii+1:xx
        b=modstr(jj).va;
        [mb,nb]=size(b);
        bc=imdilate(b,sse);
        xmax=0;
        if ma>=mb & na>=nb
            sumb=sum(sum(b));
            for kk=1:ma-mb+1
                for ll=1:na-nb+1
                    outf=and(a(kk:kk+mb-1,ll:ll+nb-1),bc);
                    forw=sum(sum(outf))/sum(sum(a(kk:kk+mb-1,ll:ll+nb-1)));
                    outb=and(ac(kk:kk+mb-1,ll:ll+nb-1),b);
                    backw=sum(sum(outb))/sumb;
                    if xmax<min(forw,backw);
                        xmax=min(forw,backw);
                    end
                end
            end
        elseif ma>=mb & na<nb
            for kk=1:ma-mb+1
                for ll=1:nb-na+1
                    outf=and(a(kk:kk+mb-1,:),bc(:,ll:ll+na-1));
                    forw=sum(sum(outf))/sum(sum(a(kk:kk+mb-1,:)));
                    outb=and(ac(kk:kk+mb-1,:),b(:,ll:ll+na-1));
                    backw=sum(sum(outb))/sum(sum(b(:,ll:ll+na-1)));
                    if xmax<min(forw,backw);
                        xmax=min(forw,backw);
                    end
                end 
            end
        elseif ma<mb & na>=nb
            for kk=1:mb-ma+1
                for ll=1:na-nb+1
                    outf=and(a(:,ll:ll+nb-1),bc(kk:kk+ma-1,:));
                    forw=sum(sum(outf))/sum(sum(a(:,ll:ll+nb-1)));
                    outb=and(ac(:,ll:ll+nb-1),b(kk:kk+ma-1,:));
                    backw=sum(sum(outb))/sum(sum(b(kk:kk+ma-1,:)));
                    if xmax<min(forw,backw);
                        xmax=min(forw,backw);
                    end
                end 
            end
        elseif ma<mb & na<nb
            suma=sum(sum(a));
            for kk=1:mb-ma+1
                for ll=1:nb-na+1
                    outf=and(a,bc(kk:kk+ma-1,ll:ll+na-1));
                    forw=sum(sum(outf))/suma;
                    outb=and(ac,b(kk:kk+ma-1,ll:ll+na-1));
                    backw=sum(sum(outb))/sum(sum(b(kk:kk+ma-1,ll:ll+na-1)));
                    if xmax<min(forw,backw);
                        xmax=min(forw,backw);
                    end
                end
            end
        end
        ccov(ii,jj)=xmax;
    end
end
ccov=ccov+ccov';

% 计算近临函数矩阵lij
[x,ind]=sort(ccov);
m=size(ccov,1);
mij=zeros(m,m);
for ii=1:m
    for jj=1:m
        mij(ii,ind(jj,ii))=m-jj+1;
    end
end
lij=mij+mij'-2;
ee=6*eye(m);
lij=lij+ee;

% 构造初始聚类
[clu,rowid]=max(ccov);
[sclu,idc]=sort(clu);
sidc=idc;
cc=0;
while length(sidc)>0
    xx=rowid(sidc(1))*ones(1,length(sidc));
    xout=xx-sidc;
    if all(xout)
        cc=cc+1;
        catecell{cc}=sidc(1);
        sidc(1)=[];
    else
        cc=cc+1;
        catecell{cc}=[sidc(1) rowid(sidc(1))];
        for ii=2:length(sidc)
            if sidc(ii)==rowid(sidc(1));
                sidc(ii)=[];
                break
            end
        end
        sidc(1)=[];
    end
end

% 迭代聚类运算
while length(catecell)>2
    % 计算类间最小近邻函数值rij
    rij=zeros(length(catecell),length(catecell));        
    for ii=1:length(catecell)-1
        ca=catecell{ii};
        for jj=ii+1:length(catecell)
            cb=catecell{jj};
            rij(ii,jj)=min(min(lij(ca,cb)));
        end
    end
    rij=rij+rij';
    rij=rij+diag(2*m*ones(size(rij,1),1));
    [ri,rowi]=min(rij);
    [sri,riind]=sort(ri);
    
    flag=[];dflag=[];
    for ii=1:length(sri)
        fmark=0;
        if isempty(flag),fmark=1;
        elseif all(riind(ii)*ones(1,length(dflag))-dflag)& all(rowi(riind(ii))*ones(1,length(dflag))-dflag)
            fmark=1;
        end
        if fmark==1
            eli=catecell{riind(ii)};
            plij=lij(eli,eli);
            elong=length(eli);
            if elong>1
                cons=ones(elong,elong)-triu(ones(elong,elong));
                aimax=max(max(cons.*plij));
            else
                aimax=plij;
            end
            
            eli=catecell{rowi(riind(ii))};
            plij=lij(eli,eli);
            elong=length(eli);
            if elong>1
                cons=ones(elong,elong)-triu(ones(elong,elong));
                akmax=max(max(cons.*plij));
            else
                akmax=plij;
            end
            
            if sri(ii)<=akmax | sri(ii)<=aimax
                sigmin=min(riind(ii),rowi(riind(ii)));
                merg=catecell{sigmin};
                sigmax=max(riind(ii),rowi(riind(ii)));
                merg=[merg catecell{sigmax}];
                catecell{sigmin}=merg;
                dflag=[dflag sigmin sigmax];
                flag=[flag sigmax];
            end
        end
    end
    vcatecell=catecell;
    newl=length(catecell)-length(flag);
    catecell=cell(1,newl);
    ccc=0;
    for ii=1:length(vcatecell);
        if all(ii*ones(1,length(flag))-flag)
            ccc=ccc+1;
            catecell{ccc}=vcatecell{ii};
        end
    end
end




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -