otsu演算法實現(基於opecv2 0版本)

2021-09-30 11:12:07 字數 1550 閱讀 6075

出處:

otsu是nobuyuki otsu於2023年提出的一種尋找灰度影象的最佳閾值的演算法。

其**名字是《a threshold selection method from gray-level histograms》,用google可以找到pdf版,建議大致看一下**,再程式設計實現,這樣容易把握重點。我剛開始是看別人對otsu的介紹,然後程式設計實現,但每次求出的閾值都無法達到理想效果。被逼無奈,終於還是決定看看原作者的**。

演算法簡要步驟:

1 計算每個灰度值在整個影象的數量n[i];i取值從0~255;

2 計算每個灰度值出現在影象中的概率p[i],p[i]=n[i]/n,n是影象總體畫素個數,為影象的寬*高;

3 從0~255,取每個數作為乙個閾值,計算此時的前景和背景概率總和以及它們的期望,計算公式見下圖:

4 最後,根據上述幾個值獲得乙個類間方差和類內方差,公式就不放上來了,直接看**。

#include #include 

#include

"opencv2/highgui/highgui.hpp

"#include

"opencv2/opencv.hpp

"#define max_gray_value 256

#define min_gray_value 0

intotsu(cv::mat dst);

double pro_hst[max_gray_value]=;

int height=dst.cols;

int width=dst.rows;

//統計每個灰度的數量

for( i =0 ; i)

}//計算每個灰度級佔影象中的概率

for( i=min_gray_value ; i)

pro_hst[i]=(double)hst[i]/(double)(width*height);

//計算平均灰度值

u=0.0

;

for( i=min_gray_value; i)

u += i*pro_hst[i];

double det=0.0

;

for( i= min_gray_value; i< max_gray_value; i++)

det += (i-u)*(i-u)*pro_hst[i];

//統計前景和背景的平均灰度值,並計算類間方差

for( i=min_gray_value; i)

u0=uk/w0;

w1=1-w0;

u1= (u - uk )/(1-w0);

//計算類間方差

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

if ( cov >maxcov )

}std::cout

<:endl>

return

maxthread;

}int

main()

C 實現otsu演算法

類間方差最大化閾值分割演算法 otsu 可以自動計算影象二值化時的閾值,otsu的中心思想是閾值t應使目標與背景兩類的類間方差最大。具體原理如下 otsu是按影象的灰度特性,將影象分成背景和目標兩部分。背景和目標之間的類間方差越大,說明構成影象的兩部分的差別越大,當部分目標錯分為背景或部分背景錯分為...

用OpenCV實現Otsu演算法

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

OpenCv 中Otsu 演算法實現

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