最大类间方差法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27668313/article/details/77949117

最大类间方差法是由日本学者大津于1979年提出的,是一种自适应的阈值确定的方法,又叫大津法,简称OTSU。它是按图像的灰度特性,将图像分成背景和目标2部分。背景和目标之间的类间方差越大,说明构成图像的2部分的差别越大,当部分目标错分为背景或部分背景错分为目标都会导致2部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。

T为前景与背景的分割阈值,前景点数占图像比例为w0,平均灰度为u0;背景点数占图像比例为w1,平均灰度为u1,图像的总平均灰度为u,前景和背景图象的方差,则有:

 

将(1)中变换为u0-uu1-u带入(2)中,可得:


或者:


当方差g最大时,可以认为此时前景和背景差异最大,此时的灰度T是最佳阈值。类间方差法对噪声以及目标大小十分敏感,它仅对类间方差为单峰的图像产生较好的分割效果。当目标与背景的大小比例悬殊时(例如受光照不均、反光或背景复杂等因素影响),类间方差准则函数可能呈现双峰或多峰,此时效果不好。


以下为代码实现:

function OSTU
% 最大类间方差算法实现
%img=imread('E:\Program Files\MATLAB\workplace\图像分割\最大类间算法\37_7.bmp');
img=imread('rice.png');
figure;
imshow(img);
%img=rgb2gray(img);
img=double(img);
[m,n]=size(img);

Hist=zeros(1,256);
for i=1:m
    for j=1:n
        Hist(img(i,j)+1)=Hist(img(i,j)+1)+1;    %求直方图,图像灰度是从0开始,所以这里img(i,j)+1
    end
end

p=Hist/(m*n);       %直方图概率分布
uT=sum((1:256).*p(1:256));  %图像亮度均值,其实比真正的均值要大1,所以后面减了1

sigma_2=zeros(1,256);
for k=1:256
    sigma_2(k)=(uT*w(k,p)-u(k,p))^2/(w(k,p)*(1-w(k,p)));    %类间方差
end

[~, index]=max(sigma_2);       %求最大类间方差的索引
index=index-1;                 %这里索引是1-256,实际图像灰度是0-255,所以减1

imgn=img>index;
figure;
imshow(imgn);

    function re=w(k,p)      %直方图前k个亮度级的0阶累积矩(前景图像所占比例)
        re=sum(p(1:k));
    end

    function re=u(k,p)      %直方图前k个亮度级的1阶累积矩(前景图像灰度均值)
        re=sum((1:k).*p(1:k));
    end
end

   

  



猜你喜欢

转载自blog.csdn.net/qq_27668313/article/details/77949117
今日推荐