最大类间方差

1.概述

在计算机视觉和图像处理领域,最大类间方差法(otsu)又叫做大津法,是1979年由日本学者大津提出的,是一种自适应阈值分割方法,减少灰阶图像等级成为一个二值图像。该算法假定图像分为两类(符合双峰直方图分布,两类分别称为前景/目标像素和背景像素),然后计算出一个最优的阈值将将此图像分为两类使得其类间方差最大。Otsu是费舍尔离散判断分析的一维表现形式。

2.方法

最大类间方差采用穷举的方式,找到阈值来使intra-class variance最小。intra-class variance定义为两个类的方差的加权和。
设灰度级最大位L(8bit图像为256)的图像的像素点总个数是 N ,灰度值为i的像素的个数为 ni δ2w(t)δ2b(t),δ2T(t) 分别为类内方差,类间方差和总方差,则有

δ2w(t)=w0(t)δ20(t)+w1(t)δ21(t)

δ2b(t)=w0(u0uT)2+w1(u1uT)2
uT=w0u0+w1u1 代入上式得
δ2b(t)=w0w1(u0u1)2

1) w0(t) 表示使用阈值 t 分割的两类图像,前景像素点所占的比例;
w0(t)=i=0t1p(i)=i=0t1niN

2) w1(t) 表示使用阈值 t 分割的两类图像,后景像素点所占的比例;
w1(t)=i=tL1p(i)=i=tL1niN

3) u0,1,T(t) 表示前景,背景,整体图像的灰度平均值:
u0(t)=i=0t1ip(i)w0=i=0t1iniNu1(t)=i=tL1ip(i)w1=i=tL1iniNuT(t)=i=0L1ip(i)=i=0L1iniN

性能:
1)类间方差法对噪音十分敏感,在处理之前应对图片进行去噪处理。
2)当目标与背景的大小比例悬殊的时候,类间方差函数可能呈现双峰或者多峰,这个时候 效果不好。慎用!

步骤:
1、初始化一阈值 th ,将图像 f(x,y) 分为两类A类和B类。
2、分别计算A,B两类像素像素集合的均值 uA,uB
3、计算A,B两类的类间方差;
4、将 th 从0到255循环,分别计算A,B的类间方差,当类间方差最大时,对应的 th 就是所求的最佳分割或二值化阈值。

%调用最大类间方差matlab函数实现图像的二值化
I = imread('4.2.01.tiff');
level = graythresh(I);
BW = im2bw(I,level);
imshow(BW) 
%调用最大类间方差matlab函数实现图像的二值化
scoreImage=imread('DemCap_016R_Off.bmp');
scoreImage=rgb2gray(scoreImage);
height = size(scoreImage,1);
width = size(scoreImage,2);
histogramCounts=zeros(1,256);

%histogramCounts of the image
for k=0:255
    for i=1:height
        for j=1:width
            if scoreImage(i,j)==k
                histogramCounts(k+1)= histogramCounts(k+1)+1;
            end

        end
    end
end

total = sum(histogramCounts); % total is the number of pixels in the given image. 

% OTSU automatic thresholding method
sumB = 0;
w0 = 0;
maximum = 0.0;
sum1 = dot( (0:255), histogramCounts);
for ii=1:256
    w0 = w0 + histogramCounts(ii)
    if (w0 == 0)
        continue;
    end
    w1 = total - w0;
    if (w1 == 0)
        break;
    end
    sumB = sumB +  (ii-1) * histogramCounts(ii);
    u0 = sumB / w0;
    u1 = (sum1 - sumB) / w1;
    between = w0 * w1 * (u0 - u1) * (u0 - u1);
    if ( between >= maximum )
        level = ii;
        maximum = between;
    end
end

 for i=1:height
        for j=1:width
            if scoreImage(i,j)>level
                scoreImage(i,j)=255;
            else
                scoreImage(i,j)=0;
            end

        end
 end

 imshow(scoreImage);

参考文献:
1、https://en.wikipedia.org/wiki/Otsu%27s_method

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值