基于MATLAB的图像分割算法仿真

基于区域的全局阈值选取方法对一幅图像而言,不同的区域,比如说目标区域或背景区域,同一区域内的象素,在位置和灰度级上同时具有较强的一致性和相关性。而在上述基于点的全局阈值选取方法中,有一个共同的弊病,那就是它们实际上只考虑了直方图提供的灰度级信息,而忽略了图像的空间位置细节,其结果就是它们对于最佳阈值并不是反映在直方图的谷点的情况会束手无策,不幸我们通常遇到的很多图像恰恰是这种情况。另一方面,完全不同的两幅图片却可以有相同的直方图,所以即使对于峰谷明显的情况,这些方法也不能保证你得到合理的阈值。于是,人们又提出了很多基于空间信息的阈值化方法。可以说,局部区域的全局阈值选取方法,是基于点的方法,再加上考虑点领域内象素相关性质组合而成,所以某些方法常称为“二维xxx方法”。由于考虑了象素领域的相关性质,因此对噪声有一定抑止作用。

3 图像切割的实现

 3.1 图像切割实现代码

clc

clear all;

%%%%%%%%%%%%极小值图像切割%%%%%%%%%%%%%%%%%%%%%%%%%

I=imread('C:\Documents and Settings\Administrator\桌面\课程设计题目\2.bmp');

figure(1);

subplot(121),imhist(I); % 观察灰度直方图, 灰度80处有谷,确定阈值T=80

title('直方图');

subplot(1,2,2),imshow(I);

title('原图')

I1=im2bw(I,80/255); % im2bw函数需要将灰度值转换到[0,1]范围内

figure(2)

subplot(3,2,1),imshow(I1);

title('极小值点阈值切割');

%%%%%%%%%%%%%%%%%迭代法图像切割%%%%%%%%%%%%%%%%%%%%%%%%

I=imread('C:\Documents and Settings\Administrator\桌面\课程设计题目\2.bmp');

[x,y]=size(I);

a=imhist(I);

I=double(I);  

max=1;

for i=2:x

    if a(max)<a(i)

        max=i;

    end

end

min=1;

for i=2:x

    if a(min)>a(i)

        min=i;

    end

end      

z0=max

z1=min

T=(z0+z1)/2;                     

TT=0;

S0=0; n0=0;

S1=0; n1=0;

allow=0.5;                      

d=abs(T-TT);

count=0;                       

while(d>=allow)                

    count=count+1;

    for i=1:x

        for j=1:y

            if (I(i,j)>=T)

                S0=S0+I(i,j);

                n0=n0+1;

            end

            if (I(i,j)<T)

                S1=S1+I(i,j);

                n1=n1+1;

            end

        end

    end

    T0=S0/n0;

    T1=S1/n1;

    TT=(T0+T1)/2;

    d=abs(T-TT);

    T=TT;

end

tmax2=T %tmax2 =77.2717

Seg=zeros(x,y);

for i=1:x

    for j=1:y

        if(I(i,j)>=T)

            Seg(i,j)=1;              

        end

    end

end

subplot(322),imshow(Seg);

title('迭代阈值分割1');

SI=1-Seg;  

subplot(323),imshow(SI);

title('迭代阈值分割2');

%%%%%%%%%%%%%%%%%%最优法切割%%%%%%%%%%%%%%%%%%%%%%%%%%

I=imread('C:\Documents and Settings\Administrator\桌面\课程设计题目\2.bmp');

[m,n]=size(I);

dt = 1;

d = 0.3;

I9 = I;

I9=double(I9);

while (abs(dt-d)>0.001)

    background = 0;

    object = 0;

    bm = 0;%背景象素数

    om = 0;%前景象素数

    for i=1:m

        for j=1:n

            if (I9(i,j)<d)

                background = background +I9(i,j);

                bm = bm+1;

            else

                object = object + I9(i,j);

                om = om+1;

            end

        end

    end

    dt = d;

    d = (background/bm+object/om)/2; %假设先验概率相同

end

tmax3=d  %tmax3 =79.9102

for i = 1:m

    for j = 1:n

          if I9(i,j)<d

              I9(i,j)=0;

          else

              I9(i,j)=1;

        end

    end

end

subplot(324),imshow(I9);

title('最优阈值法切割');

%%%%%%%%%%%%%%%%%%%%最大方差法图像切割%%%%%%%%%%%%%%%%%%%%%%%%%%%

I=imread('C:\Documents and Settings\Administrator\桌面\课程设计题目\2.bmp');

[r,t]=size(I);

count=imhist(I);

n=r*t;

l=256;

count=count/n;%各级灰度出现的概率

for i=2:l

        if count(i)~=0

            st=i-1;

            break

        end

end

%以上循环语句实现寻找出现概率不为0的最小灰度值

for i=l:-1:1

        if count(i)~=0;

            nd=i-1;

            break

        end

end

%实现找出出现概率不为0的最大灰度值

f=count(st+1:nd+1);

p=st;q=nd-st;%p和q分别是灰度的起始和结束值

u=0;

for i=1:q;

        u=u+f(i)*(p+i-1);

        ua(i)=u;

end

%计算图像的平均灰度值

for i=1:q;

        w(i)=sum(f(1:i));

end

%计算出选择不同k的时候,A区域的概率

d=(u*w-ua).^2./(w.*(1-w));%求出不同k值时类间方差

[y,tp]=max(d);%求出最大方差对应的灰度级

tmax4=tp % tmax=96

y1=zeros(r,t);

for i=1:r

        for j=1:t

            x1(i,j)=double(I(i,j));

        end

end

for i=1:r

        for j=1:t

            if (x1(i,j)>tp)

                y1(i,j)=x1(i,j);

            else

                y1(i,j)=0;

            end

        end

end

%上面一段代码实现分割

subplot(325),imshow(y1);

title('最大方差法分割的图像');

%%%%%%%%%%%%%%%%%%%最大熵法图像切割%%%%%%%%%%%%%%%%%%%%%%%%

I=imread('C:\Documents and Settings\Administrator\桌面\课程设计题目\2.bmp');

X=double(I);

[M,N]=size(I);

hist=zeros(1,256);

tic;

for i=1:1:M

    for j=1:1:N

        fi=X(i,j);

        hist(fi+1)=hist(fi+1)+1;

    end

end

i=1:1:256;

p=zeros(1,256);

for i=1:1:256

    p(i)=hist(i)/(M*N);

end

E1=zeros(1,256);

E2=zeros(1,256);

P=zeros(1,256);

E=zeros(1,256);

 

for t=1:1:256

    for i=1:1:t

        P(t)=P(t)+p(i);

    end

        if(P(t)>0&&P(t)<1)

           for i=1:1:t

               E1(t)=E1(t)-(p(i)/P(t))*log(p(i)/P(t)+eps);

           end

           for i=t+1:1:256

               E2(t)=E2(t)-(p(i)/(1-P(t)))*log(p(i)/(1-P(t))+eps);

           end

       end

       E(t)=E1(t)+E2(t);

end

MAX=0.000001;

for t=68:1:156

    if(E(t)>MAX)

        MAX=E(t);

        th=t;

    end

end

tmax5=th  %tmax5=84

g=zeros(M,N);

for i=1:1:M

   for j=1:1:N

       if(th<X(i,j))

         X(i,j)=1;

         g(i,j)=X(i,j);

     else X(i,j)=0;

         g(i,j)=X(i,j);

     end

 end

end

X=X.*255;

X=uint8(X);

subplot(326),imshow(X);

title('最大熵阈值分割图');

t_eclapsed=toc;

  • 13
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值