用OSTU方法实现对灰度图像实现阀值分割

    将灰度图像化为二进制图像的关键在于确定背景与目标的灰度分界线,即找到一个阀值使得大于此阀值的像素点为目标,灰度小于此阀值的像素点为背景。本例使用大律法(OSTU)实现图像的阀值分割,从而能够更好地判断图像中的背景和目标像素点。Matlab代码如下:

 

% 本程序时利用最大类间方差算法求解自适应阀值,对图像进行分割
clear;
warning off;
% finalT=0;
I=imread('baboon.bmp');
%rgb转灰度
if isrgb(I)==1
    I_gray=rgb2gray(I);
else
    I_gray=I;
end
subplot(1,2,1),imshow(I_gray),title('原图');
I_double=double(I_gray);%转化为双精度
[wid,len]=size(I_gray);
colorlevel=256;%灰度级
hist=zeros(colorlevel,1);%直方图
threshold=128;%初始化阀值
%计算直方图
for i=1:wid
    for j=1:len
        m=I_gray(i,j)+1;
        hist(m)=hist(m)+1;
    end
end
hist=hist/(wid*len); %直方图归一化,hist数据的元素为每个灰度所占有像素个数与总像素个数的比例
miuT=0;
for m=1:colorlevel
    miuT=miuT+(m-1)*hist(m);%miuT为图像的平均灰度
end
xigmaB2=0;
for mindex=1:colorlevel
    threshold=mindex-1;
    omega1=0;
    omega2=0;
    for m=1:threshold-1
        omega1=omega1+hist(m);%omega1为小于threshold的所有灰度所占据像素个数总和和总像素个数的比例,即前景点数占图像的比例w0
    end
    omega2=1-omega1;%omega2为背景点数占图像的比例w1;
    miu1=0;
    miu2=0;
    for m=1:colorlevel
        if m<threshold
            miu1=miu1+(m-1)*hist(m);%前景点灰度总和与像素个数总和之比
        else
           miu2=miu2+(m-1)*hist(m);%背景点灰度总和与像素个数总和之比
        end
    end
    miu1=miu1/omega1;%前景平均灰度u0
    miu2=miu2/omega2;%背景平均灰度u1
    xigmaB21=omega1*(miu1-miuT)^2+omega2*(miu2-miuT)^2;%g=w0*(u0-u)^2+w1*(u1-u)^2
%     xigma(mindex)=xigmaB21;
    if xigmaB21>xigmaB2%找出当xigmaB21最大时的阀值threshold赋给finalT
        finalT=threshold;
        xigmaB2=xigmaB21;
    end
end
% fT=finalT/255;%阀值归一化
for i=1:wid
    for j=1:len
        if I_double(i,j)>finalT
            bin(i,j)=1;
        else
            bin(i,j)=0;
        end
    end
end
subplot(1,2,2),imshow(bin);title('OSTU分割后的二进制图像');

运行结果如图所示:

 

   

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值