出處:
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演算法被認為是影象分割中閾值選取的最佳...