C 實現otsu演算法

2021-06-26 21:31:04 字數 1113 閱讀 9404

類間方差最大化閾值分割演算法 (otsu)可以自動計算影象二值化時的閾值,otsu的中心思想是閾值t應使目標與背景兩類的類間方差最大。具體原理如下:

otsu是按影象的灰度特性,將影象分成背景和目標兩部分。背景和目標之間的類間方差越大,說明構成影象的兩部分的差別越大,當部分目標錯分為背景或部分背景錯分為目標都會導致兩部分差別變小。因此,使類間方差最大的分割意味著錯分概率最小。對於影象i(x,y),前景(即目標)和背景的分割閾值記作t,屬於前景的畫素點數占整幅影象的比例記為ω0,其平均灰度μ0;背景畫素點數占整幅影象的比例為ω1,其平均灰度為μ1。影象的總平均灰度記為μ,類間方差記為g。假設影象的背景較暗,並且影象的大小為m×n,影象中畫素的灰度值小於閾值t的畫素個數記作n0,畫素灰度大於閾值t的畫素個數記作n1,則有:

ω0=n0/m×n          (1)

ω1=n1/m×n          (2)

n0+n1=m×n        (3)

ω0+ω1=1              (4)

μ=ω0*μ0+ω1*μ1   (5)

g=ω0(μ0-μ)^2+ω1(μ1-μ)^2    (6)

將式(5)代入式(6),得到等價公式:

g=ω0ω1(μ0-μ1)^2     (7)

採用遍歷的方法得到使類間方差最大的閾值t,即為所求。

otsu演算法的c++實現**如下,傳入引數為影象資料,返回值為二值化閾值。

int thresholdofotsu(unsigned char img[height][width])

//統計各個灰度值的畫素個數

for ( i =0; i < height; i++)

} for ( i=0;i<256; i++)

w0= n0*1.0/sumhist;

for( j=0; j

else

} //計算n1、u1、w1

n1= sumhist - n0;

w1= 1 - w0;

for( j=i; j<256; j++)

else

} g =w0*w1*(u0-u1)*(u0-u1);

if(g>maxg)

} returnthreshold; }

用OpenCV實現Otsu演算法

最近在學習影象分割反面的知識,在岡薩雷斯的那本書上看到otsu演算法,身邊的同學都是用matlab來實現這個演算法。我覺得matlab寫得話,但是 的效率應該不會高。於是又惡補了一些opencv的一些基本知識,然後看了augusdi的部落格,分析了一下他的 並附上,第二份 是來自某一位大牛的 寫得更...

OpenCv 中Otsu 演算法實現

大津法或最大類間方差法 使用的是聚類的思想,把影象的灰度數按灰度級分成2個部分,使得兩個部分之間的灰度值差異最大,每個部分之間的灰度差異最小,通過方差的計算來尋找乙個合適的灰度級別來劃分。所以可以在二值化的時候採用otsu演算法來自動選取閾值進行二值化。otsu演算法被認為是影象分割中閾值選取的最佳...

OTSU演算法介紹及openCV的C 實現

otsu演算法也稱最大類間差法,有時也稱之為大津演算法。前景與背景影象的類間方差最大。因方差是灰度分布均勻性的一種度量,背景和前景之間的類間方差越大,說明構成影象的兩部分的差別越大,當部分前景錯分為背景或部分背景錯分為前景都會導致兩部分差別變小。因此,使類間方差最大的分割意味著錯分概率最小。ostu...