自適應閾值分割 大津法(OTSU演算法)C 實現

2021-07-16 17:37:12 字數 2576 閱讀 5235

大津法是一種影象灰度自適應的閾值分割演算法,是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演算法也...