基于布谷鸟算法的灰度图像增强算法
相关百度网盘资源:链接: https://pan.baidu.com/s/1Si64ENFB3d16l9tra4bWWw 提取码: krwd 复制这段内容后打开百度网盘手机App,操作更方便哦
如果需要运行代码,只需在提交的文件夹里找到input_images文件,
将jpg格式文件放入,将图像文件名改为piture即可。
算法部分正式开始
先导入图像并进行初步处理(进行灰度化,均值滤波和求标准差 公式(10)m(u, v) = 1/n^2*[∑∑f (u + i, v + j)]
公式(11)σ(u, v) = √{1/n^2*∑∑[f (u + i, v + j) - m(u + i, v + j)]^2}
部分代码:
inputimage =imread(str2) ;%导入图像
inputimage=rgb2gray(inputimage);%图像灰度化
%对图像进行均值滤波 m(u, v) = 1/n^2*[∑∑f (u + i, v + j)]
m=colfilt(gray_image,[window_size window_size],'sliding',@mean);
%求标准差 σ(u, v) = √{1/n^2*∑∑[f (u + i, v + j) - m(u + i, v + j)]^2}
snd=stdfilt(gray_image);
布谷鸟算法正式开始
初始化参数:解的取值范围,鸟巢(解)的总数,鸟巢中蛋被发现的概率,随机初始化鸟巢
参数名称 参数值
图像大小 256 X 256
Levy飞行策略 Λ=1.5,a0 = 0.01
最大迭代次数 tmax = 15
鸟巢被抛弃的概率Pa 0.25
鸟巢总数 25
说明:对应解的取值范围,论文对b,c的范围进行调整产生的效果进行探索,设置了三组取值范围。
参数组 a b c k
组1 0< a <1.5 0 <b <0.5 0 < c < 1 0.5<k<1.5
组2 0< a <1.5 1<b <Gm/2 0 < c < 1 0.5<k<1.5
组3 0< a <1.5 Gm/2<b<Gm 0.5 < c < 1.5 0.5<k<1.5
组4 0< a <1.5 Gm/2<b<Gm 0< c < 1 0.5<k<1.5
组5 0<a <1.5 1 < b < Gm/2 0.5 < c <1.5 0.5<k<1.5
使用适应度函数计算解对应的函数值。
适应度函数: out=ln(ln(E(Ie))+exp)*(edgels(Ie)/(N*M))*exp(H(Ie));
部分代码:
function [out]=fobj_test(Ie)
X=edge(Ie);%使用sobel边缘检测,目的是计算√[Sh1(u, v)^2 + Sv1(u, v)^2]
size(Ie(X));
E_Is=sum(Ie(X));
n_edgels=sum(sum(X));
[M, N]=size(Ie);
H=entropy(Ie);
out=log(log(E_Is+exp(1)))*(n_edgels/(N*M))*exp(H);
end
计算得到最好的鸟巢(解)和解对应的函数值。
代码:
[fmax,best,nest,fitness]=get_best_nest(nest,newnest,fitness,A,m)
进入迭代循环。
While tmax not reached do
代码:while (iter<=Max_iter)
end
产生一个新的鸟巢(解)通过Levy飞行搜索机制
公式(2):Xit+1=Xit+stepsize.*step;
公式(3):stepsize=0.01*(Xjt-Xi(t));
beta=λ=3/2
公式(7):σ=[Γ(1+λ)*sin(pi*λ/2)]/(Γ((1+λ)/2)*λ*2^((λ-1)/2)))^(1/λ)
公式(5)
s=u./abs(v).^(1/λ);
公式(4)
step = (λ* Γ(λ)*sin(pi*λ/2))/(pi*s^(1+λ));
上述公式为原文的公式,按照上述公式编写的代码为:
s=nest(j,:);
u=randn(size(s))*sigma;
v=randn(size(s));
step=u.*abs(v).^(0-1/beta)
step=(beta*gamma(beta)*sin(pi*beta/2))./(step.^(1+beta))
stepsize=0.01*step.*(s-best);
s=s+stepsize;
结果:
step =
12.3816 + 0.0000i 0.0000 - 1.0050i 0.0000 - 2.3552i 0.0000 -17.4377i
居然出现了虚数,导致了程序报错,应该是原文的公式(4)出了问题,于是去寻找公式(4)所在的论文。在借用论文中《Cuckoo Search (CS) algorithm by Xin-She Yang and Suash Deb Programmed by Xin-She Yang at Cambridge University 》
所使用的部分代码:
beta=3/2;
sigma=(gamma(1+beta)*sin(pi*beta/2)/(gamma((1+beta)/2)*beta*2^((beta-1)/2)))^(1/beta);
u=randn(size(s))*sigma;
v=randn(size(s));
step=u./abs(v).^(1/beta);
stepsize=0.01*step.*(s-best);
% factor 0.01 comes from the fact that L/100 should be the typical step
% size of walk,where L is the typical lenghtscale
s=s+stepsize.*randn(size(s));
nest(j,:)=simplebounds(s,Lb,Ub);
使用适应度函数计算新解对应的函数值Fi
评估新解与原来的解
if Fi(新解对应的函数值) > Fj(原解对应的函数值) then
|
| 用新解代替原解
|
end
代码:
if fnew>fmax
fmax=fnew;
bestnest=best;
end
使用贪心选择算法产生新的解(鸟巢),这是论文的重要创新点:在原有Levy搜索算法基础上再加上贪心搜索算法。
公式(19) xipt+1 = xtip + r(xtip - xtkp)
Xit+1 = [xt+1i1 , xt+2i2 , . . . , xt+1iD ]
部分代码:
r=(rand-0.5)*2*1;
% 产生一个新解
modifPos=nest(i,j)+r*(nest(i,j)-nest(Xk,j));
new=nest(i,:);
new(j)=modifPos;
% 限辐
new=simplebounds(new,Lb,Ub);
G=trasform(A,GM,snd,m,new);
evFit=fobj_test(G);
计算新解的函数值 Fˆi = F (Xit+1)
比较新解与旧解的函数值
if Fˆi > Fi then
| 用新的解取代原来的解
end
以一定概率抛弃鸟巢并且新建新的鸟巢
到这里发现,论文可能真的存在一点问题,因为如果完完全全按照论文的公式进行编程,在Levy步骤就会产生虚数值(直接导致程序报错),网上编程的常用方法是借用类似论文公式(8)(具体公式没找到),来进行Levy步骤的编程。而在抛弃旧鸟巢新建新鸟巢时也是用公式(8),真的是奇怪,如果后面有时间,可能会进一步探索。
公式(8):Xi(t+1) = Xit + α0 ⊗ H(Pa - r) ⊗ (Xjt - Xtk ),
部分代码:
n=size(nest,1);
%是否发现鸟蛋
K=rand(size(nest))>pa;
stepsize=rand*(nest(randperm(n),:)-nest(randperm(n),:);
new_nest=nest+stepsize.*K;
保留最好的解(鸟巢)
找到目前所有鸟巢中,最好的鸟巢(解)
if Fnew(目前最好的) > Fmax(历史最好的) then
| Fmax=Fnew and Xmax = Xnew
End
部分代码:
if fnew>fmax
fmax=fnew;
bestnest=best;
end
迭代次数加1
部分代码:
iter=iter+1
end 布谷鸟算法结束
Return Xmax(解), Fmax(解对应的函数值)