OSTU(大津演算法)

2021-08-17 21:03:06 字數 1643 閱讀 5470

一、前言

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值作為影象的全域性閾值

二、實現**

ostu演算法實現函式為下面中的int getostu(const mat& in),其實在opencv中已經在threshold中實現了,下面**也比較了兩者的結果

#include "opencv2/core/core.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"

using namespace cv;

#include int getostu(const mat & in);

int main()

std::cout<<"the return value of getostu is: "<(i);

//對第i 行的每個畫素(byte)操作

for( int j = 0; j < cols; ++j )

}int threshold;

long sum0 = 0, sum1 = 0; //儲存前景的灰度總和及背景灰度總和

long cnt0 = 0, cnt1 = 0; //前景的總個數及背景的總個數

double w0 = 0, w1 = 0; //前景及背景所佔整幅影象的比例

double u0 = 0, u1 = 0; //前景及背景的平均灰度

double variance = 0; //最大類間方差

double maxvariance = 0;

for(int i = 1; i < 256; i++) //一次遍歷每個畫素

u0 = (double)sum0 / cnt0;

w0 = (double)cnt0 / size;

for(int j = i ; j <= 255; j++)

u1 = (double)sum1 / cnt1;

w1 = 1 - w0; // (double)cnt1 / size;

variance = w0 * w1 * (u0 - u1) * (u0 - u1);

if(variance > maxvariance)

}

return threshold;

}

大津二值化演算法(Ostu二值化演算法)及其改進演算法

使用大津演算法來二值化影象!大津演算法,也被稱作最大類間方差法,是一種可以自動確定二值化中閾值的演算法,從類內方差和類間方差的比值計算得來 也就是說 類內方差 sw 2 w0 s0 2 w1 s1 2 類間方差 sb 2 w0 m0 mt 2 w1 m1 mt 2 w0 w1 m0 m1 2 影象所...

大津法 OTSU演算法

opencv的二值化操作中,有一種 大津閾值處理 的方法,使用函式cvthreshold image,image2,0,255,cv thresh otsu 實現,該函式就會使用大律法otsu得到的全域性自適應閾值來進行二值化,而引數中的threshold不再起作用。otsu演算法 otsu演算法也...

大津法 OTSU演算法

opencv的二值化操作中,有一種 大津閾值處理 的方法,使用函式cvthreshold image,image2,0,255,cv thresh otsu 實現,該函式就會使用大律法otsu得到的全域性自適應閾值來進行二值化,而引數中的threshold不再起作用。otsu演算法 otsu演算法也...