加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

图像分割matlab程序(遗传算法,大津法,区域生长法,迭代法分割图像)

(2013-07-10 15:17:06)
标签:

it

分类: Matlab

%%%%%%%%%%%%%%%%区域生长的图像分割程序%%%%%%%%%%%%
image=imread('mri1.bmp');
I=rgb2gray(image);
figure,imshow(I),title('原始图像')
I=double(I);
[M,N]=size(I);
[y,x]=getpts;             %获得区域生长起始点
x1=round(x);            %横坐标取整
y1=round(y);            %纵坐标取整
seed=I(x1,y1);           %将生长起始点灰度值存入seed中
Y=zeros(M,N);          %作一个全零与原图像等大的图像矩阵Y,作为输出图像矩阵
Y(x1,y1)=1;             %将Y中与所取点相对应位置的点设置为白场
sum=seed;              %储存符合区域生长条件的点的灰度值的和
suit=1;                 %储存符合区域生长条件的点的个数
count=1;               %记录每次判断一点周围八点符合条件的新点的数目
threshold=15;       %域值
while count>0
s=0;                  %记录判断一点周围八点时,符合条件的新点的灰度值之和
count=0;
for i=1:M
   for j=1:N
     if Y(i,j)==1
      if (i-1)>0 && (i+1)<(M+1) && (j-1)>0 && (j+1)<(N+1) %判断此点是否为图像边界上的点
       for u= -1:1                               %判断点周围八点是否符合域值条件
        for v= -1:1                               %u,v为偏移量
          if  Y(i+u,j+v)==0 & abs(I(i+u,j+v)-seed)<=threshold& 1/(1+1/15*abs(I(i+u,j+v)-seed))>0.8%判断是否未存在于输出矩阵Y,并且为符合域值条件的点
             Y(i+u,j+v)=1;                       %符合以上两条件即将其在Y中与之位置对应的点设置为白场
             count=count+1;                                
             s=s+I(i+u,j+v);                      %此点的灰度之加入s中
          end
        end 
       end
      end
     end
   end
end
suit=suit+count;                                   %将n加入符合点数计数器中
sum=sum+s;                                     %将s加入符合点的灰度值总合中
seed=sum/suit;                                    %计算新的灰度平均值
end
figure,imshow(Y),title('分割后图像')

 
%%%%%%%%%%%%%%%%遗传算法在道路图像阈值分割中的应用%%%%%%%%%%%%
function main()
clear all
close all
clc
global chrom oldpop fitness lchrom  popsize cross_rate mutation_rate yuzhisum
global maxgen  m n fit gen yuzhi A B C oldpop1 popsize1 b b1 fitness1 yuzhi1
A=imread('mh.jpg');     %读入道路图像
%A=imresize(A,0.4);
B=rgb2gray(A);         %灰度化
C=B;
%C=imresize(B,0.1);     %将读入的图像缩小
lchrom=8;              %染色体长度
popsize=10;            %种群大小
cross_rate=0.7;        %交叉概率
mutation_rate=0.4;     %变异概率
maxgen=150;            %最大代数
[m,n]=size(C);
'计算中,请稍等...'
initpop;    %初始种群
for gen=1:maxgen
    generation;  %遗传操作
end
findresult; %图象分割结果
%%%输出进化各曲线
figure;
gen=1:maxgen;
plot(gen,fit(1,gen));
title('最佳适应度值进化曲线');
figure;
plot(gen,yuzhi(1,gen));
title('每一代的最佳阈值进化曲线');
%%%%%%%%%%%%%%%%%%%初始化种群%%%%%%%%%%%%%%%%%%%%
function initpop()
global lchrom oldpop popsize chrom C
imshow(C);
for i=1:popsize
    chrom=rand(1,lchrom);
    for j=1:lchrom
        if chrom(1,j)<0.5
            chrom(1,j)=0;
       else
           chrom(1,j)=1;
        end
    end
    oldpop(i,1:lchrom)=chrom;   
end
%%%%%%%%%%%%%%%%%产生新一代个体%%%%%%%%%%%%%%%%%%%%%%
function generation()
fitness_order;                  %计算适应度值及排序
select;                         %选择操作
crossover;                      %交叉
mutation;                       %变异
%%%%%%%%%%%%%%%%%计算适度值并且排序%%%%%%%%%%%%%%%%%%%
function fitness_order()
global lchrom oldpop fitness popsize chrom fit gen C m n  fitness1 yuzhisum
global lowsum higsum u1 u2 yuzhi gen oldpop1 popsize1 b1 b yuzhi1
if popsize>=5
    popsize=ceil(popsize-0.03*gen);
end
if gen==75     %当进化到末期的时候调整种群规模和交叉、变异概率
    cross_rate=0.3;        %交叉概率
    mutation_rate=0.3;     %变异概率
end
%如果不是第一代则将上一代操作后的种群根据此代的种群规模装入此代种群中
if gen>1  
    t=oldpop;
    j=popsize1;
    for i=1:popsize
        if j>=1
            oldpop(i,:)=t(j,:);
        end
        j=j-1;
    end
end
%计算适度值并排序
for i=1:popsize
    lowsum=0;
    higsum=0;
    lownum=0;
    hignum=0;
    chrom=oldpop(i,:);
    c=0;
    for j=1:lchrom
        c=c+chrom(1,j)*(2^(lchrom-j));
    end
    b(1,i)=c*255/(2^lchrom-1);  %转化到灰度值       
    for x=1:m
        for y=1:n
            if C(x,y)<=b(1,i)
                lowsum=lowsum+double(C(x,y));%统计低于阈值的灰度值的总和
                lownum=lownum+1; %统计低于阈值的灰度值的像素的总个数
            else
                higsum=higsum+double(C(x,y));%统计高于阈值的灰度值的总和
                hignum=hignum+1; %统计高于阈值的灰度值的像素的总个数
            end
        end
    end
    if lownum~=0
        u1=lowsum/lownum; %u1、u2为对应于两类的平均灰度值
    else
        u1=0;
    end
    if hignum~=0
        u2=higsum/hignum;
    else
        u2=0;
    end  
    fitness(1,i)=lownum*hignum*(u1-u2)^2; %计算适度值
end
if gen==1 %如果为第一代,从小往大排序
    for i=1:popsize
        j=i+1;
        while j<=popsize
            if fitness(1,i)>fitness(1,j)
                tempf=fitness(1,i);
                tempc=oldpop(i,:);
                tempb=b(1,i);
                b(1,i)=b(1,j);
                b(1,j)=tempb;
                fitness(1,i)=fitness(1,j);
                oldpop(i,:)=oldpop(j,:);
                fitness(1,j)=tempf;
                oldpop(j,:)=tempc;
            end
            j=j+1;
        end
    end
    for i=1:popsize
        fitness1(1,i)=fitness(1,i);
        b1(1,i)=b(1,i);
        oldpop1(i,:)=oldpop(i,:);
    end
    popsize1=popsize;
else %大于一代时进行如下从小到大排序
    for i=1:popsize
        j=i+1;
        while j<=popsize
            if fitness(1,i)>fitness(1,j)
                tempf=fitness(1,i);
                tempc=oldpop(i,:);
                tempb=b(1,i);
                b(1,i)=b(1,j);
                b(1,j)=tempb;
                fitness(1,i)=fitness(1,j);
                oldpop(i,:)=oldpop(j,:);
                fitness(1,j)=tempf;
                oldpop(j,:)=tempc;
            end
            j=j+1;
        end
    end
end
%下边对上一代群体进行排序
for i=1:popsize1
    j=i+1;
    while j<=popsize1
        if fitness1(1,i)>fitness1(1,j)
            tempf=fitness1(1,i);
            tempc=oldpop1(i,:);
            tempb=b1(1,i);
            b1(1,i)=b1(1,j);
            b1(1,j)=tempb;
            fitness1(1,i)=fitness1(1,j);
            oldpop1(i,:)=oldpop1(j,:);
            fitness1(1,j)=tempf;
            oldpop1(j,:)=tempc;
        end
        j=j+1;
    end
end
%下边统计每一代中的最佳阈值和最佳适应度值
if gen==1
    fit(1,gen)=fitness(1,popsize);
    yuzhi(1,gen)=b(1,popsize);
    yuzhisum=0;
else
    if fitness(1,popsize)>fitness1(1,popsize1)
        yuzhi(1,gen)=b(1,popsize); %每一代中的最佳阈值
        fit(1,gen)=fitness(1,popsize);%每一代中的最佳适应度
    else
        yuzhi(1,gen)=b1(1,popsize1);
        fit(1,gen)=fitness1(1,popsize1);
    end
end
%%%%%%%%%%%%%%%%%%%精英选择%%%%%%%%%%%%%%%%%%%%
function select()
global fitness popsize oldpop temp popsize1 oldpop1 gen b b1 fitness1
%统计前一个群体中适应值比当前群体适应值大的个数
s=popsize1+1;
for j=popsize1:-1:1
    if fitness(1,popsize)
        s=j;
    end
end
for i=1:popsize
    temp(i,:)=oldpop(i,:);
end
if s~=popsize1+1
    if gen<50  %小于50代用上一代中用适应度值大于当前代的个体随机代替当前代中的个体
        for i=s:popsize1
            p=rand;
            j=floor(p*popsize+1);
            temp(j,:)=oldpop1(i,:);
            b(1,j)=b1(1,i);
            fitness(1,j)=fitness1(1,i);
        end
    else
        if gen<100  P~100代用上一代中用适应度值大于当前代的个体代替当前代中的最差个体
            j=1;
            for i=s:popsize1
                temp(j,:)=oldpop1(i,:);
                b(1,j)=b1(1,i);
                fitness(1,j)=fitness1(1,i);
                j=j+1;
            end
        else %大于100代用上一代中的优秀的一半代替当前代中的最差的一半,加快寻优
            j=popsize1;
            for i=1:floor(popsize/2)
                temp(i,:)=oldpop1(j,:);
                b(1,i)=b1(1,j);
                fitness(1,i)=fitness1(1,j);
                j=j-1;
            end
        end
    end
end
%将当前代的各项数据保存
for i=1:popsize
    b1(1,i)=b(1,i);
end   
for i=1:popsize
    fitness1(1,i)=fitness(1,i);
end
for i=1:popsize
    oldpop1(i,:)=temp(i,:);
end
popsize1=popsize;
%%%%%%%%%%%%%交叉%%%%%%%%%%%%%%%%%%%%%%%%%%
function crossover()
global temp popsize cross_rate lchrom
j=1;
for i=1:popsize
    p=rand;
    if p        parent(j,:)=temp(i,:);
        a(1,j)=i;
        j=j+1;
    end
end
j=j-1;
if rem(j,2)~=0
    j=j-1;
end
if j>=2
    for k=1:2:j
        cutpoint=round(rand*(lchrom-1));
        f=k;
        for i=1:cutpoint
            temp(a(1,f),i)=parent(f,i);
            temp(a(1,f+1),i)=parent(f+1,i);
        end
        for i=(cutpoint+1):lchrom
            temp(a(1,f),i)=parent(f+1,i);
            temp(a(1,f+1),i)=parent(f,i);
        end
    end
end
%%%%%%%%%%%%%%%%%%%%%%%%%变异%%%%%%%%%%%%%%%%%%%%%
function mutation()
global popsize lchrom mutation_rate temp newpop oldpop
sum=lchrom*popsize;    %总基因个数
mutnum=round(mutation_rate*sum);    %发生变异的基因数目
for i=1:mutnum
    s=rem((round(rand*(sum-1))),lchrom)+1; %确定所在基因的位数
    t=ceil((round(rand*(sum-1)))/lchrom); %确定变异的是哪个基因
    if t<1
        t=1;
    end
    if t>popsize
        t=popsize;
    end
    if s>lchrom
        s=lchrom;
    end
    if temp(t,s)==1
        temp(t,s)=0;
    else
        temp(t,s)=1;
    end
end
for i=1:popsize
    oldpop(i,:)=temp(i,:);
end
%%%%%%%%%%%%%%%%%%%%%%查看结果%%%%%%%%%%%%%%%%%%%%
function findresult()
global maxgen yuzhi m n C B A
result=floor(yuzhi(1,maxgen)) %result为最佳阈值
C=B;
%C=imresize(B,0.3);
imshow(A);
title('原始裂缝图像')
figure;
subplot(1,2,1)
imshow(C);
title('原始裂缝灰度图')
[m,n]=size(C);
%用所找到的阈值分割图象
for i=1:m
    for j=1:n
        if C(i,j)<=result
            C(i,j)=0;
        else
            C(i,j)=255;
        end
    end
end
subplot(1,2,2)
imshow(C);
title('阈值分割后的裂缝图');

 

 

%%%%%%%%%%%%%%%迭代法%%%%%%%%%%%%%%%%%%%%%%

clear 
clc; 
tic                               %计时器
Init=imread('.jpg'); 
Im=rgb2gray(Init);
subplot(1,3,1),imhist(Im),title('直方图') 
subplot(1,3,2),imshow(Im) , title('原始图像') 

[x,y]=size(Im);                    % 求出图象大小 
b=double(Im);                   
zd=double(max(max(Im)))                  % 求出图象中最大的灰度 
zx=double(min(min(Im)))                % 最小的灰度  
T=double((zd+zx))/2;                     % T赋初值,为最大值和最小值的平均值 

count=double(0);                         % 记录几次循环 
while 1                   % 迭代最佳阈值分割算法 
    count=count+1; 
    S0=0.0; n0=0.0;                   %为计算灰度大于阈值的元素的灰度总值、个数赋值 
    S1=0.0; n1=0.0;                   %为计算灰度小于阈值的元素的灰度总值、个数赋值 
    for i=1:x
        for j=1:y
            if double(Im(i,j))>=T
                S1=S1+double(Im(i,j));  %大于阈域值图像点灰度值累加
                n1=n1+1;                %大于阈域值图像点个数累加
            else 
                S0=S0+double(Im(i,j));  %小于阈域值图像点灰度值累加
                n0=n0+1;                %小于阀域值图像点个数累加
            end 
        end 
    end  
    T0=S0/n0; %求小于阀域值均值
    T1=S1/n1; %求大于阀域值均值
    if abs(T-((T0+T1)/2))<0.1     %迭代至 前后两次阀域值相差几乎为0时 停止迭代。
        break;
    else
       T=(T0+T1)/2;                 %在阈值T下,迭代阈值的计算过程 
   end 
end 

count                                %显示运行次数
                      %显示最佳阈值 算出T= 114.4306
toc
i1=im2bw(Im,T/255);               % 图像在最佳阈值下二值化 
subplot(1,3,3),imshow(i1) 
title('实验结果')

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有