1.概述
在计算机视觉和图像处理领域,最大类间方差法(otsu)又叫做大津法,是1979年由日本学者大津提出的,是一种自适应阈值分割方法,减少灰阶图像等级成为一个二值图像。该算法假定图像分为两类(符合双峰直方图分布,两类分别称为前景/目标像素和背景像素),然后计算出一个最优的阈值将将此图像分为两类使得其类间方差最大。Otsu是费舍尔离散判断分析的一维表现形式。
2.方法
最大类间方差采用穷举的方式,找到阈值来使intra-class variance最小。intra-class variance定义为两个类的方差的加权和。
设灰度级最大位L(8bit图像为256)的图像的像素点总个数是
N
,灰度值为
δ2w(t)=w0(t)δ20(t)+w1(t)δ21(t)
δ2b(t)=w0(u0−uT)2+w1(u1−uT)2
因
uT=w0u0+w1u1
代入上式得
δ2b(t)=w0w1(u0−u1)2
1) w0(t) 表示使用阈值 t 分割的两类图像,前景像素点所占的比例;
2) w1(t) 表示使用阈值 t 分割的两类图像,后景像素点所占的比例;
3) u0,1,T(t) 表示前景,背景,整体图像的灰度平均值:
u0(t)=∑i=0t−1ip(i)w0=∑i=0t−1iniNu1(t)=∑i=tL−1ip(i)w1=∑i=tL−1iniNuT(t)=∑i=0L−1ip(i)=∑i=0L−1iniN
性能:
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);