clear all;close all;clc;
% 由于具有随机性,不是每次都能够找到最高峰,所以此方法只有优化的功能
% img = double(imread('d:\corrimg.bmp'));
img = double(imread('corrImg_0.bmp'));
[m n] = size(img);
nm = ceil(m/8)*8;
nn = ceil(n/8)*8;
img1 = zeros(nm,nn);
img1(1:m,1:n) = img;
m = nm;
n = nn;
% mesh(img1);
% hold on;
nl=64; %粒子群粒子个数
sqrtnl = sqrt(nl);
resimg = zeros(10,10);
res=struct([]);
tic
for kk = 1:100
%初始化粒子群,定义结构体
%结构体中八个元素,分别是粒子坐标,粒子速度,粒子适应度,粒子最佳适应度,粒子最佳坐标
par=struct([]);
for i = 1:sqrtnl
for j=1:sqrtnl
par((i-1)*sqrtnl+j).x = min(m,(j-1)*floor(m/sqrtnl) + floor(m/(sqrtnl*2))); %对x位置均匀初始化 x,y为图像下标,为int型
par((i-1)*sqrtnl+j).y = min(n,(i-1)*floor(n/sqrtnl) + floor(n/(sqrtnl*2))); %对y位置均匀初始化
end
end
for i=1:nl
par(i).vx=-2+randi(3); %[-1 0 1]对vx速度随机初始化
par(i).vy=-2+randi(3); %[-1 0 1]对vy速度随机初始化
par(i).fit=0; %粒子适应度为0初始化
par(i).bestfit=0; %粒子最佳适应度为0初始化
par(i).bestx=par(i).x; %粒子x最佳位置初始化
par(i).besty=par(i).y; %粒子y最佳位置初始化
end
par_best=par(1); %初始化粒子群中最佳粒子
for k=1:100
% hold on;
% plot3(par_best.y,par_best.x,par_best.fit,'r*'); %画出最佳粒子的位置
for p=1:nl
[par(p) par_best]=update_par(par(p),k,p,par_best,img1); %更新每个粒子信息
end
end
resimg(floor((kk-1)/10)+1,mod(kk-1,10)+1) = par_best.fit;
res(kk).x = par_best.x - 134;
res(kk).y = par_best.y - 170;
end
toc
% figure,
resimg
% [[res.x]' [ res.y]']
xx = 1:100
% plot([res.x]' ,[ res.y]','r+');
axis([0 101 -10 10]);
hold on;
plot(xx,[res.x]','r');
hold on;
plot(xx,[res.y]','b');
% imshow(resimg,[]);