使用蚁群算法进行图像分割报告.docx
- 文档编号:24148720
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:15
- 大小:168.25KB
使用蚁群算法进行图像分割报告.docx
《使用蚁群算法进行图像分割报告.docx》由会员分享,可在线阅读,更多相关《使用蚁群算法进行图像分割报告.docx(15页珍藏版)》请在冰豆网上搜索。
使用蚁群算法进行图像分割报告
使用蚁群算法进行图像分割报告
绪论
蚁群算法是模拟蚂蚁群体觅食行为的仿生优化算法。
本文利用蚁群算法进行图像分割,提取目标图像的边缘路径,概括来说,是通过一定数量的人工蚂蚁根据图像的灰度值特性自由觅食,在觅食的过程中形成的信息素矩阵即代表了图像的边缘特征信息。
1本例中蚁群算法的几个要素
一幅图像中包括目标、背景、边界和噪声等内容,边缘提取的目的是要找出体现这些内容之间区别的特征量。
区别目标和背景的一个重要的特征是像素灰度,因此选用像素的灰度值作为主要特征。
另外,边界点或噪声点往往是灰度值发生突变的地方,而该点处的梯度体现出这种变化,是反映边界点与背景或目标区域内点区别的重要特征。
因此,在定义可见度因数时,一定要把梯度值作为首要特征。
1.1确定初始蚂蚁数目
蚁群算法是一种随机搜索算法,它通过多个候选解组成群体的进化过程来寻求最优解,在这个进化过程中,既需要每个个体的自适应能力,更需要群体的相互协作,这个相互协作,通过个体之间的信息交流来完成。
蚁群的数量越多,算法的全局搜索能力以及算法的稳定性越高,但是若蚂蚁数目较大,会使大量的曾被搜索过的解上的信息量的变化比较平均,信息正反馈的作用不明显,搜索的随机性虽然得到了加强,但收敛速度减慢,在本例中,蚂蚁数目取为图像像素数的开方值。
1.2蚂蚁转移概率
在蚁群算法的第n步,某一点处的蚂蚁转移到像素点(i,j)的概率主要由该点信息素浓度和能见度因数来决定,其计算公式为【1】:
其中,
表示蚂蚁k下一步容许去的城市集合。
与
成正比,
为从像素点i,j的信息素因数,
为像素点i,j的能见度因数,α,β参数分别反映了蚂蚁在转移过程中,像素点所累积的信息素和像素点的启发信息,在蚂蚁选择转移时的相对重要性。
α为信息启发因子,反映了蚂蚁在向另一个像素点转移时,这目标像素点所累积的信息素在指导蚁群搜索中选择像素点转移时的相对重要程度,反映了蚁群在路径搜索中随机性因素作用的强度。
α值越大,蚂蚁选择以前走过的像素点的可能性越大,搜索的随机性越弱。
α值过大也可能使蚁群的搜索过早陷于局部最优。
本例中α值取为1。
β为期望值启发式因子,反映了蚂蚁在搜索过程中启发信息在指导蚁群搜索中的相对重要程度。
期望值启发因子β的大小反映了蚁群在道路搜索中先验性、确定性因素作用的强度,其值越大,蚂蚁在某个局部点上选择局部最短路径的可能性越大。
虽然它使搜索的收敛速度得以加快,但蚁群在最优路径的搜索过程中随机性减弱,容易陷入局部最优。
本例中β值取为0.1。
1.3信息素矩阵的更新
蚁群有着令人惊奇的信息系统,研究发现,当蚂蚁外出觅食或在回巢穴的途中,它们都会释放一种特殊的信息素气味来标识行进的轨迹,蚂蚁用这种独有的无声语言来设置类似人类路标的蚁踪。
蚂蚁在寻找食物过程中,在它们经过的地方所留下的信息素,不仅能被同一蚁群中的其他蚂蚁感知到,而且其强度也能被感知,蚂蚁会倾向于沿信息素浓度较高的方向移动,而移动过程又会留下新的信息素,对原有的信息素进行加强。
信息素的更新策略主要有蚁密模型、蚁量模型和蚁周模型。
其中,蚁周模型用的是全局信息,即完成一次循环对所经过的整条路径上的信息素进行更新,整体性较强;而蚁量和蚁密两种模型用的是局部信息,即蚂蚁每完成一步后就对刚经过的路径上的信息素进行更新。
在本例算法中,像素点之间的信息素变化参考的是蚁密模型的思想,但是在具体的计算方法上又结合了本例的特点。
即当每一只蚂蚁完成一次移动以后进行一次信息素的更新,其更新公式为:
其中,
是新信息素浓度,
是旧信息素浓度,
是能见度因数。
考虑到
和
均为矩阵,式中的乘法表示的均为矩阵中元素分别相乘。
在所有蚂蚁完成一次移动以后置零。
1.4蚂蚁的记忆值
当某两个像素点的信息素浓度较高时,某只蚂蚁很有可能会在这两个像素点之间进行往复运动,造成了算法的局部收敛。
为了克服这一缺陷,本文定义了蚂蚁的记忆值,记忆值的大小要小于某只蚂蚁移动的总步数,从而保证当蚂蚁移动一定步数以后,会消除某一时间点之前的“记忆”。
蚂蚁记忆值长度的定义公式为:
其中,A的值可以根据图像的大小人为设定,本文中取为40,B为0~1之间的随机值。
在本例中,每只蚂蚁的记忆值长度相等。
当蚂蚁准备移动时,首先检查其临近点中有没有记忆值中的像素点,如果存在,则将其移动至该像素点的概率置零。
若该蚂蚁临近的八个像素点都包含在了蚂蚁记忆值当中,那么还需要对蚂蚁临近点的移动概率进行人为设置。
当蚂蚁移动到某一像素点时,需要将该像素点记录到蚂蚁的记忆值当中,若蚂蚁的记忆值溢出,则还需要进行数值的平移处理。
2用于图像分割的蚁群算法的流程
2.1初始化过程
导入图片后,首先将RGB真彩图转换为灰度值图,然后将K只蚂蚁随机地分散在这张灰度值图像上,图像大小为M1×M2,初始蚂蚁的数量为图像面积的开方值,如下式:
。
同时,信息素矩阵也被初始化为
。
其次,我们需要进行的是能见度因数η的确定。
在本例中,将能见度因数η定义为:
其中
,
是临近像素灰度值的一个函数,它被定义为【2】:
其中I为每个像素点的灰度值。
本例中,我们要寻找的是两只老虎的边界,边界点的特点是该点与周边几个点的像素灰度值差别较大,所以这里我们定义了一个能够反映灰度值差别的函数
,当该值较大时,说明该像素点为老虎边界点的概率就大一些。
计算完能见度因数后,本文又定义了一个新的参数,蚂蚁的记忆值。
该值的设定是为了防止蚂蚁在信息素浓度较高的两个像素点进行往复移动,造成算法的局部收敛。
蚂蚁记忆值的大小计算也遵从一定的随机性,如下式:
其中,A的值可以根据图像的大小人为设定,本文中取为40,B为0~1之间的随机值。
2.2移动过程
本文共进行了900次移动过程,在每一次的移动过程中,被放置的K只蚂蚁都会在概率
的指导作用下选择下一个目的地(像素点),而该蚂蚁的目标像素点必须临近其所在的像素点。
存在一个问题是当蚂蚁在某一像素点时,它可以移动到哪些像素点。
在这里,我们既可以设为邻近的四个像素点也可以设为邻近的八个像素点。
在本例中,蚂蚁在某一像素点时,可移动到的像素点为邻近的八个像素点【3】。
在蚂蚁选择目标像素点之前,首先要进行图像的边缘检测,因为蚂蚁是不能够移动到图像之外的,因此需要将图像外的点的信息素浓度置零。
另外还需要检查在蚂蚁的记忆值中已经包含了哪些像素点,也要给以去除。
如果邻近的八个像素点都包含在了蚂蚁记忆值当中,那么还需要对蚂蚁临近点的移动概率进行人为设置。
确定当前蚂蚁可以到达的像素点以后,本文接下来计算了移动到各个像素点的概率值,即蚂蚁移动到各个像素点的可能性,然后用一个随机数来确定目的地。
到达目的地后,需要将目的地信息记录到蚂蚁的记忆值当中,如果蚂蚁的记忆值已经溢出,则需要进行数值的平移处理。
在将目的地信息记录到蚂蚁的记忆值当中时,本文采用了将二维数据转化为一维数据的方法,这样可以降低运算复杂度并简化读入、读出和“遗忘”记忆值的程序。
2.3更新过程
当每只蚂蚁完成一次移动过程以后,将目标像素点的信息素进行一次更新。
这样可以及时地更新信息素浓度。
在本例中,其更新公式定义为:
其中,
是新信息素浓度,
是旧信息素浓度,
是能见度因数。
2.4决策过程
决策过程是为了决断信息素较高的若干点是否为所求的图像边缘,即在若干次蚂蚁的移动循环之后,找到图像的边缘信息。
此时,要对信息素矩阵
设定一个门限值T。
第一步,最初的
的定义是信息素矩阵的平均值。
如下式:
并令迭代索引数l=0。
第二步,信息素矩阵的全部元素被划分为两类,分别是大于
的元素和小于
的元素,并分别计算这两类元素的平均值,如下式:
其中:
第三步,将迭代索引数和门限值更新,如下式:
第四步,如果
(ε为一设定值,本例中取为1)则返回第二步。
否则,就可以将灰度值大于
的像素点定义为需提取图像的边界E。
如下式:
3结论与分析
本文应用了蚁群算法来进行图像边缘的检测,主要结果如下图:
书中作业的图片没有电子版,在书中的打印质量不是很清晰,我是用扫描仪获得的该图像,扫描出来的图像轮廓比较模糊,再加上背景非常复杂,所以应用算法的结果也不是非常的理想,仅得到了大致的轮廓和一些老虎身上的纹路。
因此,我又从网络上下载了一张比较清楚的老虎照片进行算法分析,由于这张照片图像清晰,背景较简单,所以结果也比较理想,能够得到老虎的大致轮廓。
从这几幅图中的对比可以看出,虽然老虎的边缘基本上被检测出来,但是老虎身上的纹路依然有很大的梯度,因此,老虎身上的斑纹也被描绘了出来。
而目标任务仅仅是将图像中的老虎进行分离,因此,如何区别老虎身上的噪声点和老虎与背景之间的轮廓是一个以后需要研究的内容。
参考文献
[1]李人厚.王拓.智能控制理论和方法[M].西安电子科技大学出版社
[2]JingTian.WeiyuYu.ShengliXie.AnAntColonyOptimizationAlgorithmForImageEdgeDetection[J].2008IEEECongressonEvolutionaryComputation
[3]韩彦芳.施鹏飞.基于蚁群算法的图像分割方法[J].计算机工程与应用
附录
MATLAB源程序
functionfunc111
filename='tigers';
img=double(imread([filename'.bmp']))./255;
img=rgb2gray(img);
[nrow,ncol]=size(img);
v=zeros(size(img));
v_norm=0;
forrr=1:
nrow
forcc=1:
ncol
temp1=[rr-2cc-1;rr-2cc+1;rr-1cc-2;rr-1cc-1;rr-1cc;rr-1cc+1;rr-1cc+2;rrcc-1];
temp2=[rr+2cc+1;rr+2cc-1;rr+1cc+2;rr+1cc+1;rr+1cc;rr+1cc-1;rr+1cc-2;rrcc+1];
temp0=find(temp1(:
1)>=1&temp1(:
1)<=nrow&temp1(:
2)>=1&temp1(:
2)<=ncol&temp2(:
1)>=1&temp2(:
1)<=nrow&temp2(:
2)>=1&temp2(:
2)<=ncol);
temp11=temp1(temp0,:
);
temp22=temp2(temp0,:
);
temp00=zeros(size(temp11,1));
forkk=1:
size(temp11,1)
temp00(kk)=abs(img(temp11(kk,1),temp11(kk,2))-img(temp22(kk,1),temp22(kk,2)));
end
ifsize(temp11,1)==0
v(rr,cc)=0;
v_norm=v_norm+v(rr,cc);
else
lambda=100;
temp00=lambda.*temp00.^4;
end
v(rr,cc)=sum(sum(temp00));
v_norm=v_norm+v(rr,cc);
end
end
v=v./v_norm;
p=0.0001.*ones(size(img));
alpha=1;
beta=0.1;
rho=0.1;
ant_total_num=round(sqrt(nrow*ncol));
ant_pos_idx=zeros(ant_total_num,2);
temp=rand(ant_total_num,2);
ant_pos_idx(:
1)=round(1+(nrow-1)*temp(:
1));
ant_pos_idx(:
2)=round(1+(ncol-1)*temp(:
2));
A=40;
memory_length=round(rand
(1).*(0.3*A)+0.85*A);
ant_memory=zeros(ant_total_num,memory_length);
total_step_num=900;
forstep_idx=1:
total_step_num
delta_p_current=zeros(nrow,ncol);
forant_idx=1:
ant_total_num
ant_current_row_idx=ant_pos_idx(ant_idx,1);
ant_current_col_idx=ant_pos_idx(ant_idx,2);
rr=ant_current_row_idx;
cc=ant_current_col_idx;
ant_search_range_temp=[rr-1cc-1;rr-1cc;rr-1cc+1;rrcc-1;rrcc+1;rr+1cc-1;rr+1cc;rr+1cc+1];
temp=ant_search_range_temp(:
1)>=1&ant_search_range_temp(:
1)<=nrow&ant_search_range_temp(:
2)>=1&ant_search_range_temp(:
2)<=ncol;
ant_search_range=ant_search_range_temp(temp,:
);
ant_transit_prob_v=zeros(size(ant_search_range,1),1);
ant_transit_prob_p=zeros(size(ant_search_range,1),1);
forkk=1:
size(ant_search_range,1)
temp=(ant_search_range(kk,1)-1)*ncol+ant_search_range(kk,2);
ifisempty(find(ant_memory(ant_idx,:
)==temp,1))
ant_transit_prob_v(kk)=v(ant_search_range(kk,1),ant_search_range(kk,2));
ant_transit_prob_p(kk)=p(ant_search_range(kk,1),ant_search_range(kk,2));
else
ant_transit_prob_v(kk)=0;
ant_transit_prob_p(kk)=0;
end
end
if(sum(sum(ant_transit_prob_v))==0)||(sum(sum(ant_transit_prob_p))==0)
forkk=1:
size(ant_search_range,1)
ant_transit_prob_v(kk)=v(ant_search_range(kk,1),ant_search_range(kk,2));
ant_transit_prob_p(kk)=p(ant_search_range(kk,1),ant_search_range(kk,2));
end
end
ant_transit_prob=(ant_transit_prob_v.^alpha).*(ant_transit_prob_p.^beta)./(sum(sum((ant_transit_prob_v.^alpha).*(ant_transit_prob_p.^beta))));
temp=find(cumsum(ant_transit_prob)>=rand
(1),1);
ant_next_row_idx=ant_search_range(temp,1);
ant_next_col_idx=ant_search_range(temp,2);
ifisempty(ant_next_row_idx)
ant_next_row_idx=ant_current_row_idx;
ant_next_col_idx=ant_current_col_idx;
end
ant_pos_idx(ant_idx,1)=ant_next_row_idx;
ant_pos_idx(ant_idx,2)=ant_next_col_idx;
delta_p_current(ant_pos_idx(ant_idx,1),ant_pos_idx(ant_idx,2))=1;
ifstep_idx<=memory_length
ant_memory(ant_idx,step_idx)=(ant_pos_idx(ant_idx,1)-1)*ncol+ant_pos_idx(ant_idx,2);
elseifstep_idx>memory_length
ant_memory(ant_idx,:
)=circshift(ant_memory(ant_idx,:
),[0-1]);
ant_memory(ant_idx,end)=(ant_pos_idx(ant_idx,1)-1)*ncol+ant_pos_idx(ant_idx,2);
end
p=((1-rho).*p+rho.*delta_p_current.*v).*delta_p_current+p.*(abs(1-delta_p_current));
end
end
T=judge(p);
imwrite(uint8(abs((p>=0.8*T).*255-255)),gray(256),[filename'_edge_aco_''.bmp'],'bmp');
functiontt=judge(I)
I=I(:
);
[counts,N]=hist(I,256);
i=1;
mu=cumsum(counts);
T(i)=(sum(N.*counts))/mu(end);
mu2=cumsum(counts(N<=T(i)));
MBT=sum(N(N<=T(i)).*counts(N<=T(i)))/mu2(end);
mu3=cumsum(counts(N>T(i)));
MAT=sum(N(N>T(i)).*counts(N>T(i)))/mu3(end);
i=i+1;
T(i)=(MAT+MBT)/2;
Threshold=T(i);
whileabs(T(i)-T(i-1))>=1
mu2=cumsum(counts(N<=T(i)));
MBT=sum(N(N<=T(i)).*counts(N<=T(i)))/mu2(end);
mu3=cumsum(counts(N>T(i)));
MAT=sum(N(N>T(i)).*counts(N>T(i)))/mu3(end);
i=i+1;
T(i)=(MAT+MBT)/2;
Threshold=T(i);
end
tt=Threshold;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用 算法 进行 图像 分割 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)