一、前言
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演算法也...