Ostu最大类间差方法

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

 

Ostu方法又名最大类间差方法,通过统计整个图像的直方图特性来实现全局阈值T的自动选取,其算法步骤为:

1) 先计算图像的直方图,即将图像所有的像素点按照0~255256bin,统计落在每个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),直到i256时结束迭代

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);

 

猜你喜欢

转载自blog.csdn.net/caomin1hao/article/details/82225822