大津算法(OTSU)

大津算法(OTSU)
在圖像處理領(lǐng)域,我們會遇到如下需求:把圖像中的目標物體和背景分開。比如背景用白色表示,目標物體用黑色表示。此時我們知道目標物體的灰度值相互接近,背景灰度值相互接近,那么用大津算法能很好把目標從背景當中區(qū)分開來。

算法思想

目標

比如對于下面這張灰度圖片


目標物體是中間黑色的幾何物體,我們想讓這些物體和背景區(qū)分更明顯一些,比如讓物體為純黑,背景全白。那么我們就需要找到一個合適的閾值,使圖片上灰度值大于這個閾值的像素點為255(白色),灰度值小于閾值的像素點為0(黑色)。也就是變成下面這幅圖:


那么大津算法需要處理的就是找到最佳的閾值,讓目標和物體盡可能分離開。

灰度直方圖

為了找到合適的閾值,我們首先觀察原圖的灰度直方圖??:


這是用 Matlab 對原圖形成的灰度直方圖,灰度直方圖的含義是統(tǒng)計圖像中不同灰度值的分布情況。由圖我們可以看出兩個尖峰,在灰度值為0~20的地方存在一個尖峰,代表原圖中有大量像素點灰度值為0~20,經(jīng)觀察我們可以認為這部分對應(yīng)于目標物體。同理我們可以看出背景的灰度值大多集中于100~140之間,為了讓目標和背景區(qū)分更加明顯,我們想讓目標物體的灰度值全為0,背景的灰度值全為255,這種處理手法也稱為二值化法。

那么閾值取多少合適呢?從圖上看似乎取50~100中的任意一點都可以,但是實際情況并不想?yún)⒖紙D那樣明顯,有些圖片背景和目標物體較為接近,我們需要一個算法來找到最優(yōu)閾值才行。

聚類

首先我們思考什么樣的東西才能成為一類,而我們又是怎么分類的。對于參考圖來說,我們可以認為灰度值接近的為一類,灰度值不接近的不是同一類。那我們又是如何衡量灰度值接近的程度呢?這里面就需要用到方差的概念。
方差相比大家都了解,同一類的物體方差小,不同類的物體方差大。所以對于此圖我們希望分類的結(jié)果是對于灰度值相近的同一類物體,它的方差最小,稱為類內(nèi)方差最小?;叶戎挡唤咏牟煌愇矬w,它的方差大,稱為類間方差最大。

步驟

所以步驟總結(jié)如下:
首先我們要形成參考圖的灰度直方圖,這樣方便我們找到最佳閾值。
接下來我們通過窮舉每一個灰度值,計算以此為閾值的類內(nèi)和類間方差。
找到能形成類內(nèi)方差最小的或類間方差最大的閾值,這個就是我們要找的最佳閾值。

算法

下面以兩類分割講解下具體的算法,實際上大津算法可以分割多類出來。

因為簡書不支持顯示 MathJax 語法的公式,所以對這部分感興趣的直接移步到《大津算法(OTSU)》查看吧。

代碼實現(xiàn)

C語言實現(xiàn)

/* OTSU 算法
 * *src 存儲灰度圖像,width 圖像寬,height 圖像長
 * 返回最佳閾值
 */
int otsu(const int *src, int width, int height)
{
    int histogram[256]; //存儲灰度直方圖,這里為256色灰度
    int t,thred;
    float wf,wb,ub,uf,curVal,maxVal;
    int sumb=0,sumf=0,sumW=0,sumPixel=width*height;
    wb=wf=maxVal=0.0f;
    
    //求灰度直方圖
    memset(histogram,0,sizeof(histogram));
    for(i=0;i<width*height;i++)
    {
        histogram[src[i]]++;
    }
    
    for (i=0;i<256;i++)
        sumW+=i*histogram[I];
    
    //枚舉每個灰度    
    for(t=0;t<256;t++)
    {
        //求兩類類概率密度
        wb+=histogram[t];
        wf=sumPixel-wb;
        if (wb==0||wf==0)
            continue;
        
        //求類均值
        sumb+=i*histogram[t];
        sumf=sumW-sumb;
        ub=sumb/wb;
        uf=sumf/wf;
        
        //求當前類間方差
        curVal=wb*wf*(ub-uf)*(ub-uf);
        if(curVal>maxVal)
        {
            thred=t;
            maxVal=curVal;
        }
    }
    return thred;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 二值化是圖像分割的一種方法。在二值化圖象的時候把大于某個臨界灰度值的像素灰度設(shè)為灰度極大值,把小于這個值的像素灰度...
    木夜溯閱讀 13,321評論 0 10
  • 不同圖像灰度不同,邊界處一般會有明顯的邊緣,利用此特征可以分割圖像。需要說明的是:邊緣和物體間的邊界并不等同,邊緣...
    大川無敵閱讀 14,125評論 0 29
  • Tutorial - 1 (a) 為什么e時代需要生物特征識別我們在信息時代面臨諸多問題,如病毒、黑客、計算機盜竊...
    ShellyWhen閱讀 2,778評論 0 4
  • 1、閾值分割 1.1 簡介 圖像閾值化分割是一種傳統(tǒng)的最常用的圖像分割方法,因其實現(xiàn)簡單、計算量小、性能較穩(wěn)定而成...
    木夜溯閱讀 22,985評論 9 15
  • ubuntu下的httpd.conf里的內(nèi)容是空的,但在/etc/apache2/下有兩個文件夾mods-enab...
    IZUMO閱讀 2,689評論 0 0

友情鏈接更多精彩內(nèi)容