Ostu方法又名最大类间差方法,通过统计整个图像的直方图特性来实现全局阈值T的自动选取,其算法步骤为:
1) 先计算图像的直方图,即将图像所有的像素点按照0~255共256个bin,统计落在每个bin的像素点数量
2) 归一化直方图,也即将每个bin中像素点数量除以总的像素点
3) i表示分类的阈值,也即一个灰度级,从0开始迭代
4) 通过归一化的直方图,统计0~i 灰度级的像素(假设像素值在此范围的像素叫做前景像素) 所占整幅图像的比例w0,并统计前景像素的平均灰度u0;统计i~255灰度级的像素(假设像素值在此范围的像素叫做背景像素) 所占整幅图像的比例w1,并统计背景像素的平均灰度u1;
5) 计算前景像素和背景像素的方差 g = w0*w1*(u0-u1) (u0-u1)
6) i++;转到4),直到i为256时结束迭代
7)将最大g相应的i值作为图像的全局阈值
clear all;close all;clc
img=imread('C:\Users\hjd\Desktop\test1.jpg');
if ndims(img)==3
img = rgb2gray(img);
end
[count, x] = imhist(img);
ostu_result = [];
sum_pixel = sum(count(:));
count_w = count(:)/sum_pixel;
count_u = count(:).*x(:);
for i=1:256
w0 = sum(count_w(1:i));
sum_u0 = sum(count_u(1:i));
u0 = sum_u0/sum(count(1:i));
if i==256
w1=0;
u1=0;
else
w1 = sum(count_w(i+1:end));
sum_u1 = sum(count_u(i+1:end));
u1 = sum_u1/sum(count(i+1:end));
end
ostu_result(i) = w0*w1*(u0-u1)^2;
end
[index,maxValue]=max(ostu_result);
level = graythresh(img);