用遗传算法做灰度图像的自动阈值分割报告
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);