關於部落格
親子旅遊記錄
加一點點的心得感想
  • 81294

    累積人氣

  • 25

    今日人氣

    0

    追蹤人氣

Qt: 影像處理: 用Otsu 演算法求閥值

 thresholding 就是將影像點依其灰度值分成兩群
一群的影像值都小於這個閥值
另一群的影像值都大於這個閥值

Otsu 的方法就是:

找閥值 t,使得群間變異數(between-class variance) 有最大值

由於閥值一定是介於1與254之間 (0與255不用考慮)
所以簡而言之
找介於1254間的t值,讓

有最大值

其中
P1(t)代表影像灰度值小於等於t值的機率
P2(t)代表影像灰度值大於t值的機率也就是1- P1(t)
μ1(t)
代表影像灰度值小於等於t值的平均值(mean)
μ2(t) 代表影像灰度值大於t值的平均值


為求以上的變數,先計算

直方圖(histogram) h

For(int y=0; y<height; y++)

   For(int x=0; x<width; x++)

      ++h(f(x,y));

再將其正規化(normalize)

For(int x=0; x<256; x++)

   Nh(x) = h(x)/width/height;

 f 代表影像, h 是一個array, 初始值為0

這樣 Nh 就成為一個機率函數了.
所需的變數就由下列各式求出

P1(t) = Nh(0)+Nh(1)+…+Nh(t)

P2(t) = Nh(t+1)+Nh(t+2)+…+Nh(255)=1- P1(t) 

μ1(t) = [1* Nh(1)+2* Nh(2)+...+t* Nh(t)] / P1(t)

μ2(t) = [(t+1)* Nh(t+1)+(t+2)* Nh(t+2)+...+255* Nh(255)] / P2(t)

好了!可以開始寫程式了


視窗有三個物件:ToolButton, 2 個PushButton

《Load Image》的功能就是啟動QFileDialog,選取影像檔,載入至ToolButton上
程式碼上可參考過去的文章

《Qtsu method》的程式碼如下



nh 就是常態化後的histogram
p1,p2,u1,u2 就是剛才介紹過的
BC 就是 Between Class Variance
第43-59行:對每一個 t , 計算 BC, 將最大的BC儲存於MaxBC及相對應的 t 儲存於MaxLevel記錄下來
第61-63行:將結果顯示出來




 

 
三個常用的512x512 灰度影像的執行結果

從程式碼for loop可以看出有改良的空間
不過下次再說吧!
相簿設定
標籤設定
相簿狀態