图像分割是区分一幅图像中的目标和背景的过程。对于许多依赖于计算机视觉的应用,如医学成像、卫星图像中的目标定位、机器视觉、指纹和人脸识别、农业成像等,图像分割是一个重要的预处理任务。图像分割阶段的准确性会对图像处理的后续阶段产生很大的影响。许多研究者对于图像分割问题已研究了多年;然而,由于图像具有如不同形式的直方图的特点,所以图像分割问题仍是一个公开的研究问题,需要进一步的研究。
最近,提出了许多技术,包括基于图形的算法边缘检测的算法进和基于阈值的算法,用于图像分割。由于阈值技术简单,在过去几年中得到了很大的关注。
另一方面,由于遗传算法能够为许多实际应用提供近似最优解,所以最近用其解决图像分割问题。一般来说,遗传算法(Genetic Algorithm,GA)是模拟自然选择的生物进化过程一种软计算模型(a soft computational model)。
本文采用基于量子遗传算法的图像阈值方法,通过寻找阈值,将阈值问题转换为优化问题。该方法的目标是最大化目标间的类内方差和最小化目标像素之中的背景像素间的类间方差。在每个目标中,像素的灰度间的同质性会影响图像分割质量。如果目标像素灰度变化,结果将有可能变差。
2 图像阈值
数字图像可以视为二维矩阵或者二元函数。它由称为像素的离散点组成。在彩色图像中,每个像素有三个值:红、绿和蓝。每个值在0到L-1的范围中,其中L是精度的数量。另一方面,灰度图像由像素组成,其中每个像素只有0到L-1之间的一个值,称之为灰度。对于许多图像处理问题,处理灰度图像比处理彩色图像更简单、有效。因此,在使用图像处理算法前,会将彩色图像转换为灰度图像。最常用的灰度为256(即每个像素值在0到255之间)。
图像阈值是一种用于灰度图像的图像分割方法。该想法是为了找到一个阈值,如果像素低于阈值,就认为是背景,否则认为是目标的一部分。基于阈值的方法分为单级阈值(single-level thresholding)和多级阈值(multi-level thresholding)。多阈值方法通常是通过寻找将多个目标分开的多个阈值作为图像阈值。
%%初始部分,读取图像及计算相关信息clear all;close all;clc;[I,filename]=sunlightopenpic;I=uint8(I);% % if isrgb(I)==1% % I=rgb2gray(I);% % endLmin=double(min(I(:)));Lmax=double(max(I(:)));graynum=double(Lmax-Lmin+1);[M,N]=size(I);hist=imhist(I);total=M*N;hist1=double(hist/total);%hist1对应是每种灰度的对应出现概率。HT=0; % 统计图像的信息熵for i=Lmin:Lmax if hist1(i+1)==0 temp=0; else temp=hist1(i+1)*log(1/hist1(i+1)); end HT=HT+temp;end%%程序主干部分,种群随机初始化,种群数取10,染色体二进制编码取8位 初始化Q(t)global population C;C=2; %对应阈值的个数population=20;Q=ones(8*C,2,population);Q=Q/sqrt(2);%这里定义种群数tic%定义一个函数,可以完成自动生成阈值,看是否需要进行判断大小的不同% X0=autotransq2p(Q,population,Lmin,Lmax,C); X0=observe(Q,Lmin,Lmax)';%X0=round(rand(1,population)*graynum);%此处X0是对应有C行 population列的矩阵 %X0对应量子随机生成population个含C个元素的阈值向量【0 255】 for i=1:population %*************************************************** adapt_value1(i)=multiksw(X0(:,i),C,Lmin,Lmax,hist1,HT); %*****以上适应函数可以重新定义**************************** %计算自适应值 X0(i)为当前阈值 上式是计算在此阈值情况下图像信息墒的大小 endmax_entropy1=max(adapt_value1);%统计这population=10个阈值最佳适应值number1=find(adapt_value1==max_entropy1);tp=size(number1);opt_Q2=zeros(8*C,2,tp(2));opt_Q1=zeros(8*C,2,tp(2));if tp(2)==1 t_opt1(:,1)=X0(:,number1); opt_Q1(:,:,1)=Q(:,:,number1);else temp=double(zeros(C,1)); for te=1:tp(2) ti=number1(1,te); temp(:,1)=temp(:,1)+X0(:,ti); end % opt_Q(:,:,1)=round(sum(Q(:,:,number1(1,1):number1(1:tp(2))))/tp(2));% t_opt1(:,1)=round(sum(X0(:,number1(1,1):number1(1:tp(2))))/tp(2)); t_opt1(:,1)=round(temp(:,1)/tp(2)); %初始化最佳阈值 i=round(rand(1)*tp(2)); if i==0 i=1; end opt_Q1(:,:,1)=Q(:,:,number1(i)); end%最佳阈值为t_opt1 adapt_average1=mean(adapt_value1); %统计这population个阈值对应墒值的均值 X1=X0; generation=500; %遗传的代数for gen=1:generation %按照个体交叉,变异操作生成新的10个阈值% Q=checkq(Q); X2=observe(Q,Lmin,Lmax)'; %s1是随机观察的结果,仅仅根据Q中的概率随机生成,但是要保证每个 for i=1:population adapt_value2(i)=multiksw(X2(:,i),C,Lmin,Lmax,hist1,HT); end max_entropy2=max(adapt_value2); adapt_average2=mean(adapt_value2); % if max_entropy2>max_entropy1% max_entropy1=max_entropy2; number2=find(adapt_value2==max_entropy2); tp=size(number2); if tp(2)==1 t_opt2(:,1)=X2(:,number2); opt_Q2(:,:,1)=Q(:,:,number2); else % tempQ=double(zeros(C*8,2,1)); temp=double(zeros(C,1)); for te=1:tp(2) ti=number2(1,te); temp(:,1)=temp(:,1)+X2(:,ti);% tempQ(:,:,1)=tempQ(:,:,1)+Q(:,:,ti); end t_opt2(:,1)=round(temp(:,1)/tp(2)); i=round(rand(1)*tp(2)); if i==0 i=1; end opt_Q2(:,:,1)=Q(:,:,number2(i)); % opt_Q(:,:,1)=round(tempQ(:,:,1)/tp(2)); end s1=X2'; %%%%s_code1=dec2bin(s1,8); %将s1的元素以二进制的形式给出,送给s_code1 for i=1:C s_code1(:,(i-1)*8+1:i*8)=dec2bin(s1(:,i),8); %将s1的元素以二进制的形式给出,送给s_code1 end% % c1=multitotalcross(s_code1,population,C); %全干扰交叉 此处使用population>位深的情况 %利用旋转门完成量子变异算子 %******************7.11改进 % if abs(adapt_average2-adapt_average1)<=0.01 % if abs(max_entropy1-max_entropy2)<=0.001 if abs(max_entropy1-max_entropy2)<=0.0001 || abs(adapt_average2-adapt_average1)<=0.001 disp('循环迭代次数:'); disp(gen); break; else %如果当前的最优个体比总的最优个体更优,则用当前的个体替换总体最优个体 %否则,用总的最佳个体替换当前最差个体 if max_entropy1 max_entropy1=max_entropy2; t_opt1=t_opt2; opt_Q1(:,:,1)=opt_Q2(:,:,1); % else% % min_value=min(adapt_value2);% number=find(adapt_value2==min_value);% P=size(number);% for r=1:P(2)% t=number(1,r);% Q(:,:,t)=opt_Q1(:,:,1); % X2(:,t)= t_opt1(:,1);% adapt_value2(t)=max_entropy1;% end end Q=multiqmutation(s_code1,max_entropy1,t_opt1,Q,hist1,HT,Lmin,Lmax); %量子变异算子 X1=X2; adapt_value1=adapt_value2; adapt_average1=adapt_average2; end end disp('量子遗传算法优化迭代的次数')gentocstep=round(256/C)-1;TT=zeros(C+2,1);TT(1)=Lmin;TT(C+2)=Lmax;TT(2:(C+1),1)=t_opt1(:,1);seg_I=zeros(M,N);for i=1:M for j=1:N for k=2:C+2 if (I(i,j)>=TT(k-1)) && (I(i,j)<=TT(k)) seg_I(i,j)=(k-2)*step; end end end endfigure(1);subplot(2,2,1),imshow(I);title('原图');subplot(2,2,2);imshow(uint8(seg_I));title(['multiksw熵法及量子遗传算法图像多阈值',num2str(t_opt1(1)),' ',num2str(t_opt1(C)),'分类数为',num2str(C)]);subplot(2,2,3);imhist(I);title('原图像的直方图');disp('最佳直方图熵法及量子遗传算法阈值为:')t_opt1disp('对应的熵值为')multiksw(t_opt1(:,1),C,Lmin,Lmax,hist1,HT)
往期回顾>>>>>>
【模式识别】Matlab指纹识别【优化求解】A*算法解决三维路径规划问题 matlab自动识别银行卡号【优化求解】模拟退火遗传实现带时间窗的车辆路径规划问题【数学建模】Matlab实现SEIR模型【优化求解】基于NSGA-2的求解多目标柔性车间调度算法【优化求解】蚁群算法求最优值