用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            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分割后的二进制图像');

运行结果如图所示:

 

   

你可能感兴趣的:(Matlab)