logo资料库

人工智能遗传算法实现灰度图像阈值分割.docx

第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
资料共7页,全文预览结束
用遗传算法做灰度图像的自动阈值分割报告 1. 实验目的 掌握遗传算法的基本步骤,掌握 otus 灰度图像阈值算法,通过此次实验,使更好地 理解 otus 算法和遗传算法的步骤及特点。 2. 实验原理 本次实验通过 matlab 代码编写,读取彩色图并转化为灰度图,通过 otus 算法得到遗 传算法的适应度函数,在通过遗传算法得到灰度图的阈值分割点,再把灰度图采用此分 割点进行阈值分割。 3. 实验步骤 1. 彩色图转灰度图 2. 染色体编码问题 因为图像的灰度值在 0-255 之间,则采用 8 位 2 进制编码 3. 适应度函数确定 我们要对一张灰度图进行阈值分割,则要找一个灰度值,将大于此灰度值的像素 点的灰度变为 255,将小于此灰度值的像素点的灰度变为 0,然后只剩下黑白两 个颜色。此题中我们采用 otus 算法来找此灰度分割点。 关于 otus 算法的介绍: 设图像有 L 阶灰度,设图片中灰度为 i 的像素个数为 Ni 个,则图片中总像素个数 为 N=N1+N2+N3+N4+……Ni 个,则灰度为 i 的像素概率 Pi=Ni/N。 现在我们要求分割点的灰度值,则我们设这个灰度值为 k,把小于这个灰度值得 部分称为第一类灰度,大于这个灰度的部分叫做第二类灰度。 求第一类灰度的均值,U1=1P1+2P2+3P3+…..kPk 求第一类出现概率和,W1=P1+P2+P3+…..Pk 第二类灰度均值,U2=(k+1)P(k+1)+(k+2)P(k+2)+(k+3)P(k+3)+……LPL 第二类出现概率,W2=P(k+1)+P(k+2)+P(k+3)+…..P(L) 则 otus 算法为,Max(k)=W1(U1-U2)^2+W2(U2-U1)^2 则采用的适应度函数为 Max(k)函数 4. 采用遗传算法计算 k 值 1. 定义适应度函数,编码染色体,由上面的分析,函数 f(x)= W1(U1-U2) ^2+W2(U2-U1)^2 就可以作为空间 L 上的适应度函数。另一方面,8 位 2 进制 也刚好能表示区间[0,255]中的全部整数。所以,我们就仅取[0,255]中的整数 来作为参加进化的个体,并且用 8 位二进制数作为个体 k 的基因型编码,及 染色体。 2. 设定种群规模,产生初始种群。我们将种群规模设定为 3,取染色体组成初 始种群 3. 计算各代种群中的各染色体的适应度,并进行遗传操作,直到适应度最高的 染色体出现为止。得到 k 值 5.用 k 值对灰度图进行阈值分割,得到结果图像 4.实验内容 1.读取文件夹中的原彩色 jpg 图片,将其转化为灰度图,得到 它的像素个数,得到图像中各像素的灰度值,得到第一类和第二类灰
度的均值和出现概率,得到适应度函数。 原图: 代码部分:function obj=mysecond(X) col=size(X,1); I= imread('ok.jpg'); K = rgb2gray(I); x = size(K,1); y = size(K,2); h=imhist(K); %个数 for k = 0:255 P(k+1,1) = h(k+1,1)/(x*y);%概率 end for i=1:col n =X(i,1); u = 0.0; w0 = 0.0; for j = 0:n u =u + j * P(j+1,1); w0 = w0+P(j+1,1); end u0 = u/w0; w1 = 1-w0; u3 = 0.0; for l = 0:255 u3 = u3 + l*P(l+1,1);
end u1 = (u3-u)/w1; obj(i,1) = w0*w1*(u1-u0)^2; end 2.利用遗传算法得到自变量取值和最优解折线变化图
代码部分:clear all; clc; NIND = 5; NVAR = 1; PRECI = 8; GGAP = 0.7; MP = 3; FieldD =[PRECI;0;255;1;0;1;1]; for i = 1:MP %个体数目 %变量的维数 %变量的二进制位数 %交叉概率 %种群数目 %译码矩阵 Chrom{i} = crtbp(NIND, NVAR*PRECI); %创建初始种群 %在【0.7,0.9】范围 i 内随机产生交叉概率 end pc=0.7+(0.9-0.7)*rand(MP,1); pm=0.001+(0.05-0.001)*rand(MP,1); %%在【0.001,0.05】范围内随机产生变异概率 gen = 0; gen0 = 0; MAXGEN = 10; %最优个体最少保持代数 maxY = 0; for i =1:MP %初始遗传代数 %初始保持代数 %最优值 ObjV{i}=mysecond(bs2rv(Chrom{i},FieldD)); %计算各初始种群个体的目标函数值 end MaxObjV = zeros(MP,1); MaxChrom = zeros(MP,PRECI*NVAR); %记录精华种群 %记录精华种群的编码
while gen0 <= MAXGEN gen = gen + 1; for i = 1:MP %遗传代数加 1 % 各种群的适应度 FitnV{i}=ranking(-ObjV{i}); SelCh{i}=select('sus', Chrom{i}, FitnV{i},GGAP); % 选择操作 SelCh{i}=recombin('xovsp',SelCh{i}, pc(i)); SelCh{i}=mut(SelCh{i},pm(i)); ObjVSel=mysecond(bs2rv(SelCh{i}, FieldD)); [Chrom{i},ObjV{i}]=reins(Chrom{i},SelCh{i},1,1,ObjV{i},ObjVSel); % 交叉操作 % 变异操作 % 计算子代目标函数值 %重插入操作 end [Chrom,ObjV]=immigrant(Chrom,ObjV); [MaxObjV,MaxChrom]=EliteInduvidual(Chrom,ObjV,MaxObjV,MaxChrom); % 移民操作 % 人 工 选择精华种群 YY(gen)=max(MaxObjV); if YY(gen)>maxY %找出精华种群中最优的个体 %判断当前优化值是否与前一次优化值相同 maxY=YY(gen); %更新最优值 gen0=0; gen0=gen0+1; %最优值保持次数加 1 else end end %% 进化过程图 plot(1:gen,YY) xlabel('进化代数') ylabel('最优解变化') title('进化过程') xlim([1,gen]) %% 输出最优解 [Y,I]=max(MaxObjV); X=(bs2rv(MaxChrom(I,:), FieldD)); disp(['最优值为:',num2str(Y)]) disp(['对应的自变量取值:',num2str(X)]) %找出精华种群中最优的个体 %最优个体的解码解 3.得到 k 值后进行图像阈值分割,得到结果图像
代码部分: I = imread('ok.jpg'); K = rgb2gray(I); %BW1 = edge(K,'canny'); % 调用 canny 函数 %figure,imshow(BW1); % 显示分割后的图像,即梯度图像 %title('Canny') %bw2 = edge(K,'Sobel'); %figure,imshow(bw2); %bw3 = im2bw(I,0.5); %figure,imshow(bw3); x = size(K,1); y = size(K,2); for i = 1:x for j = 1:y if K(i,j) < 119 K(i,j) = 0; else end K(i,j) = 255;
end end %bw3 = edge(K,'Sobel'); figure,imshow(K);
分享到:
收藏