1. 程式人生 > >Ostu最大類間差方法

Ostu最大類間差方法

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