大津法是一種影象灰度自適應的閾值分割演算法,是2023年由日本學者大津提出,並由他的名字命名的。大津法按照影象上灰度值的分布,將影象分成背景和前景兩部分看待,前景就是我們要按照閾值分割出來的部分。背景和前景的分界值就是我們要求出的閾值。遍歷不同的閾值,計算不同閾值下對應的背景和前景之間的類內方差,當類內方差取得極大值時,此時對應的閾值就是大津法(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) 這個就是類間方差的公式表述
採用遍歷的方法得到使類間方差g最大的閾值t,即為所求。
1. 計算0~255各灰階對應的畫素個數,儲存至乙個陣列中,該陣列下標是灰度值,儲存內容是當前灰度值對應畫素數
2. 計算背景影象的平均灰度、背景影象畫素數所佔比例
3. 計算前景影象的平均灰度、前景影象畫素數所佔比例
4. 遍歷0~255各灰階,計算並尋找類間方差極大值
c++**實現:
#include #include #include #include using namespace cv;
using namespace std;
//***************otsu演算法通過求類間方差極大值求自適應閾值******************
該幅影象計算出來的大津閾值是104;
用這個閾值分割的影象:
跟opencv threshold方法中使用cv_thresh_otsu引數計算出來的分割影象一致:
大津演算法可以從影象直方圖上有乙個更為直觀的理解:大津閾值大致上是直方圖兩個峰值之間低谷的值。
對上述**稍加修改,增加畫出直方圖部分:
#include #include #include #include using namespace cv;
using namespace std;
//***************otsu演算法通過求類間方差極大值求自適應閾值******************
int otsualgthreshold(const mat image);
int main(int argc,char *argv)
{ mat image=imread(argv[1]);
imshow("soureimage",image);
cvtcolor(image,image,cv_rgb2gray);
mat imageoutput;
mat imageotsu;
int thresholdvalue=otsualgthreshold(image);
cout<
為顯示清晰,本次使用一幅對比明顯的灰度圖:
otsu分割效果:
對應閾值和直方圖:
以上影象黑白對比度非常明顯,從直方圖上也可以看到只有兩個波峰,求得的otsu閾值為102。
上圖中紅色的豎線標識出了otsu閾值分割線,顯見,閾值大致位於兩個波峰的低谷之間。
自適應閾值分割 最大類間方差法 大津法 OTSU
最大類間方差法是由日本學者大津 nobuyuki otsu 於1979年提出的,是一種自適應的閾值確定的方法,又叫大津法,簡稱otsu。它是按影象的灰度特性,將影象分成背景和目標兩部分,或者說,是尋找乙個閾值為k,將影象的顏色分為1,2.k和k 1.256兩部分。如何確定這個閾值k?演算法分類的原理...
大津法 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演算法也...