2012年5月30日 星期三

用Octave實踐Otsu二元化演算法

 自動找閥值的方法 Otsu Method

 假設閥值(thresholding value)為t,則影像被區分成兩群
一群是影像值小於等於t, 另一群影像值均大於t

Otsu 的方法就是求出一個閥值使得class A 與class B間有最大的群間變異數(between-class variance),也就是下式有最大值


其中pa(t) 代表影像值小於等於t 的機率
pb(t) 代表影像值大於t 的機率 
由於pa(t)+pb(t)=1, 所以 pb(t)=1-pa(t)
μa(t) 代表影像灰度值小於等於t值的機率平均值(mean)μb(t) 代表影像灰度值大於t值的機率平均值 
 由於閥值一定是介於0與255之間, 所以計算256次群間變異數(t=0,t=255其實可以不用算),就可以找出最大值,也因此知道哪一個閥值使得群間變異數最大。

Otsu's method 的程式碼如下:



實驗結果如下:

其結果與 graythresh 完全相同
graythresh 就是Otsu演算法且內含在 image 這個package內
如果沒有安裝package就沒有這個指令
graythresh輸出的結果是介於0與1間的正規值(normalization),所以要再乘以256

--- end ---



3 則留言:

  1. 您好:

    看了您的文章之後 覺得您 講解的很清楚

    讓我更明白了 Otsu演算法

    如果 方便的話,可不可以讓我, 請教您一問題

    如何 將 Otsu 改成可以決定 雙Threshold值 呢?

    能否 講解一下

    謝謝 您

    回覆刪除
  2. 兩個閥值喔!
    假設是 t1和t2, 由於0<=t1,t2<=255,
    所以要計算
    for t1=0 to 254
    for t2 = t1+1 to 255
    計算三群之間的變異數之和
    end
    end
    看看在 什麼樣的閥值下, 三群之間的變異數之和會最大!
    大概就是這樣啦!
    細節再想想吧!

    回覆刪除
  3. 哈哈~~ 感謝 您的提示喔

    我已經 寫出來了

    其實就跟 取一個threshold值的 很類似


    看了 您不少 影像處理相關的文章

    實在是 受惠良多

    感謝 您的協助 謝謝

    回覆刪除