-->
当前位置:首页 > 实验 > 正文内容

人工蜂群算法实验

Luz2年前 (2022-01-05)实验3425

一、实验目的

1、了解什么是图像增强;

2、掌握ABC算法应用于图像增强的基本思路;

3、掌握ABC算法应用于图像增强的编程方法;

4、掌握ABC优化方法

二、实验内容

1、对图像增强问题进行分析、转换、编码;

2、设置种群规模、侦察蜂迭代次数阈值等

3、编写代码实现适应度值计算、排序,引领蜂种群更新、跟随蜂种群更新、侦察蜂产生等;

4、优化程序

 

三、实验原理

人工蜂群算法就是模拟蜜蜂的采蜜过程而提出的一种新型智能优化算法,它也是由食物源、雇佣蜂和非雇佣蜂三部分组成。

食物源:食物源即为蜜源。在任何一个优化问题中,问题的可行解都是以一定形式给出的。在人工蜂群算法中,食物源就是待求优化问题的可行解,是人工蜂群算法中所要处理的基本对象。食物源的优劣即可行解的好坏是用蜜源花蜜量的大小即适应度来评价的。

雇佣蜂:雇佣蜂即为引领蜂与食物源的位置相对应,一个食物源对应一个引领蜂。在人工蜂群算法中,食物源的个数与引领蜂的个数相等;引领蜂的任务是发现食物源信息并以一定的概率与跟随蜂分享;概率的计算即为人工蜂群算法中的选择策略,一般是根据适应度值以轮盘赌的方法计算。

非雇佣蜂:非雇佣蜂包括跟随蜂和侦査蜂跟随蜂在蜂巢的招募区内根据引领蜂提供的蜜源信息来选择食物源,而侦查蜂是在蜂巢附近寻找新的食物源。在人工蜂群算法中,跟随蜂依据引领蜂传递的信息,在食物源附近搜索新食物源,并进行贪婪选择。若一个食物源在经过次后仍未被更新,则此引领蜂变成侦査蜂,侦查蜂寻找新的食物源代替原来的食物源。

 

四、实验代码及结果

 

五、试验分析(思考)

clear

clc

II=imread('heli.jpg');

figure; imshow(II(:,:,1)); title('原始图像');

I=im2double(II(:,:,1));

%求解原始图像全局均值D

D=mean(mean(I));

disp(D);

scah=size(I,1);scac=size(I,2);M=[];

%求原始图像局部均值

for i=1:scah

    for j=1:scac

        if i==1||i==scah||j==1||j==scac

            if i==1&&j==1

                M(i,j)=mean(mean(I(i:i+2,j:j+2)));

            elseif i==1&&j==scac

                M(i,j)=mean(mean(I(i:i+2,j-2:j)));

            elseif i==scah&&j==1

                M(i,j)=mean(mean(I(i-2:i,j:j+2)));

            elseif i==scah&&j==scac

                M(i,j)=mean(mean(I(i-2:i,j-2:j)));

            elseif i==1&&j>=2&&j<=scac

                M(i,j)=mean(mean(I(i:i+2,j-1:j+1)));

            elseif i==scah&&j>=2&&j<=scac

                M(i,j)=mean(mean(I(i-2:i,j-1:j+1)));

            elseif j==1&&i>=2&&i<=scah

                M(i,j)=mean(mean(I(i-1:i+1,j:j+2)));

            elseif j==scac&&i>=2&&i<=scah

                M(i,j)=mean(mean(I(i-1:i+1,j-2:j)));

            end

        else

            M(i,j)=mean(mean(I(i-1:i+1,j-1:j+1)));

        end

    end

end

%求解原始图像局部标准差

Lumda=[];

Lumda=stdfilt(I);

FG=zeros(1,10);

SN=30;

YL=15;

GS=15;

LB=[0,0,0,0];

HB=[1.5,0.5,1,0.5];

DWEI=4;

ZQ.f=[];

Fa=[];

xmin=[0,0,0,0];xmax=[1.5,0.5,1,0.5];

%产生初始种群

for i=1:SN

    P(i,:)=unifrnd(xmin,xmax,1,4);

    ZQ(i).f=zqtu(I,P(i,:),D,M,Lumda); %计算适应度值

    Fa(i)=fit301(ZQ(i).f);

end

zqiamge.f=[];

gs_zqiamge.f=[];

g=1;

G=100;

FB=zeros(G,DWEI+1);

t1=clock;

FC=zeros(G,YL);

limit=30;

allbee.f=[];

while g<=G

    disp(g);

    [shu,xuhao]=max(Fa);Xbest=P(xuhao,:);Xme=mean(P);

    [F1,pos]=sort(Fa);

    F1=fliplr(F1);

    pos=fliplr(pos);

    FB(g,1)=F1(1);  % 存放每次迭代的F1最大的结果

    FB(g,2:DWEI+1)=P(pos(1),:);

    for i=1:YL

        my(i,1:DWEI)=P(pos(i),:); %蜜源前D位为解,后一位为适应度值,引领蜂

        my(i,DWEI+1)=F1(i);

        gs(i,1:DWEI)=P(pos(YL+i),:); %跟随蜂群前D位为解,后一位为适应度值

        gs(i,DWEI+1)=F1(YL+i);

    end

    % 引领蜂搜索

    for i=1:YL

        while 2>1

            k=ceil(YL*rand());

            if (k~=i)

                break;

            end

        end

        for j=1:DWEI

            yl(i,j)=my(i,j)+(-1+2*rand)*(my(i,j)-my(k,j)); %引领蜂随机搜索位置,取代蜜源

            if yl(i,j)>HB(j)

                yl(i,j)=HB(j);

            end

            if yl(i,j)<LB(j)

                yl(i,j)=LB(j);

            end

        end

        % 计算新个体的适应度值

        zqiamge(i).f=zqtu(I,yl(i,:),D,M,Lumda);

        f=fit301(zqiamge(i).f);

        if f>my(i,DWEI+1)

            my(i,1:DWEI)=yl(i,:);

            my(i,DWEI+1)=f;

        end

    end

    % 跟随蜂搜索

    ff=sum(my(:,DWEI+1));

    ff1=my(:,DWEI+1)/ff;

    ff2(1)=ff1(1);

    for m=2:YL

        ff2(m)=ff2(m-1)+ff1(m); %轮盘赌找出跟随蜂的蜜源,ff2累计求和

    end

    for i=1:YL

        a=rand;

        pos1=find(ff2>=a);

        k=pos1(1);

        while 2>1

            k1=ceil(YL*rand());

            if (k1~=k)

                break;

            end

        end

        for j=1:DWEI

            gs(i,j)=my(k,j)+(-1+2*rand)*(my(k,j)-my(k1,j));

            if gs(i,j)>HB(j)

                gs(i,j)=HB(j);

            end

            if gs(i,j)<LB(j)

                gs(i,j)=LB(j);

            end

        end

        pos1=[];

    end

    % 判断是否出现侦查蜂

    FC(g,:)=my(:,1+DWEI)';

    zck=ones(1,YL);

    if g>=2

        for j=1:YL

            for i=1:g-1

                pos2=find(FC(g,j)==FC(i,:), 1);

                if isempty(pos2)~=1

                    zck(j)=1+zck(j);

                end

                pos2=[];

            end

        end

        pos2=find(zck==limit);

        if isempty(pos2)~=1

            for i=1:length(pos2)

                my(pos2(i),1:4)=unifrnd(xmin,xmax,1,4);

                ZQ(pos2(i)).f=zqtu(I,my(pos2(i),1:4),D,M,Lumda); %增强图像

                Fa(pos2(i))=fit301(ZQ(pos2(i)).f);

                my(pos2(i),5)=Fa(pos2(i));

            end

        end

    end

    P(1:YL,:)=my(:,1:DWEI);

    P(YL+1:SN,:)=gs(:,1:DWEI);

    for i=1:SN

        ZQ(i).f=zqtu(I,P(i,:),D,M,Lumda);

        Fa(i)=fit301(ZQ(i).f);

    end

    

    fitnum(g)=max(Fa);

    g=g+1;

end

[ZYshu,xu]=max(Fa);

ZZYY=ZQ(xu).f;

ZYshu

P(xu)

figure;imshow(ZZYY);title('增强图像')

figure;plot(fitnum);

 

 

% 适应度函数

function FFT=fit301(GG)

scahh=size(GG,1);scacc=size(GG,2);

TTao=[];TTao=GG;

BBian=edge(GG,'sobel');

 

for i=2:scahh-1

    for j=2:scacc-1

        Taox=GG(i+1,j-1)+2*GG(i+1,j)+GG(i+1,j+1)-GG(i-1,j-1)-2*GG(i-1,j)-GG(i-1,j+1);

        Taoy=GG(i-1,j+1)+2*GG(i,j+1)+GG(i+1,j+1)-GG(i-1,j-1)-2*GG(i,j-1)-GG(i+1,j-1);

        TTao(i,j)=sqrt(Taox^2+Taoy^2);

    end

end

Ednu=sum(sum(BBian));

if Ednu ~= 0

    EI=sum(sum(TTao.*BBian));

    temp=imhist(GG);

    xu=find(temp~=0);

    zuihou=temp(xu);

    HI=-sum(log(zuihou/(scahh*scacc)).*(zuihou/(scahh*scacc)));

    FI=log(log(EI))*Ednu*HI/(scahh*scacc);

else

    FI=0;

end

FFT=FI;

 

 

% 增强图像函数

function ZZQ=zqtu(Input,XX,DD,MM,LLumda)

scahh=size(Input,1);scacc=size(Input,2);

G=[];

for i=1:scahh

    for j=1:scacc

        G(i,j)=XX(4)*DD/(LLumda(i,j)+XX(2))*(Input(i,j)-XX(3)*MM(i,j))+MM(i,j).^XX(1);

    end

end

ZZQ=G;

 

 image.png



 

image.png 

 

 

实验成绩


阅 人


批阅时间



发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。