線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:15439
推到 Plurk!
推到 Facebook!

關於Otsu二值化的程式

尚未結案
supy
一般會員


發表:2
回覆:2
積分:0
註冊:2003-08-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-09 19:14:01 IP:140.118.xxx.xxx 未訂閱
請問各位高手,小弟手邊有一個Otsu二值化法的C範例程式,由於剛接觸BCB,實在不曉得該如何將此程式改由BCB編寫,煩請高手們幫幫忙,感激不盡!謝謝!    ps.Otsu法又稱為統計式門檻值決定法或群中變異數法(Within-group variance),利用灰階直方圖的統計原理找出最佳臨界值來分割影像中兩個群集的像素.    
 
Ostu(int k) /*k為群數*/
{    /*設定區域變數*/
     int i;
     int p;
     float min_variance = 100000000;
     float variance;
     long count;
     double mean; /*平均值*/
     double mean2; /*平均值的平方*/
    /***********************************************/
    /* 初設                                        */
    /* thresholds[],exe:thresholds[0]=0,                  */
    /* thresholds[1]=0,thresholds[2]=1,...,                */
    /* thresholds[i]=thresholds[i-1] 1,...,                 */
    /* thresholds[k-1]=thresholds[k-2],thresholds[k]=m-1;   */
    /***********************************************/
     thresholds[0] = 0;
     thresholds[k] = m-1; /*m是整張影像中有灰階值的個數*/
     thresholds[1] = 0;
     for(i=2;i (m-1)-(k-1-p))
          {
               p--;
               if (p == 0) /*如調整到需要調整index 0則full search完畢*/
                    break;
               thresholds[p]  ;
          }
          if (p == 0)
               break;
          else
          {/*調整調整位置p之後(p 1...k-1)之thresholds值為thresholds[p 1] =*/       
           /*thresholds[p] 1,...,thresholds[k-1]=thresholds[k-2] 1             */
               for(i=p 1;i    發表人 - supy 於 2003/11/09  20:05:34
        
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-11-09 19:26:38 IP:140.135.xxx.xxx 未訂閱
supy您好: 請參考下面聯結讓您的程式碼更方便閱讀 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=39722 謝謝您的配合 > 發表人 -
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-11-10 09:42:23 IP:210.68.xxx.xxx 未訂閱
你好:     bcb也可以相容c語言的程式,c需要的函式庫,bcb裡都有,所以由c轉bcb是不需 要改什麼參數,只是如果要秀出資料,就需要用一些bcb元件才行,不過Ostu()並 沒有printf(),所以直接呼叫就可以使用,只是有一些全域變數要事先宣告,應 該就能直接使用。     從Ostu(int k)這個程式來看,有一些變數是全域變數,因為沒有看到宣告,這幾 個變數你應該最清楚,要把這些變數宣告成全域變數,這個程式就能使用。
thresholds[ ]    <- 臨界值矩陣?
Sum_H[ ]         <-  ?
Sum_i[ ]         <-  ?
Sum_i2[ ]        <-  ?
Min_thresholds[ ]<-  ?
發表人 - jerrykuo 於 2003/11/10 09:43:57
supy
一般會員


發表:2
回覆:2
積分:0
註冊:2003-08-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-11-12 13:22:59 IP:140.118.xxx.xxx 未訂閱
感謝版主們的熱心回覆,謝謝!
arisaka_matsuri
高階會員


發表:25
回覆:205
積分:231
註冊:2003-10-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-11-25 12:02:18 IP:163.28.xxx.xxx 未訂閱
supy 你好:    目前我也正在進行影像相關的研究課題,這是我處理程式中的一個函數,提供給大家參考。    我想,supy貼出來的程式碼似曾相似,應該是同一本書上的[1]。不過,我覺得書上附的的程式碼怪怪的,自己看了好幾次還是說不上來那邊怪。只知道我的思維不是那樣,所以按照書上的公式,自己推了一遍,可以改寫成程式囉~所以,有興趣多瞭解的話,就把參考資料中的介紹公式推一遍吧!對照我的程式,應該更快理解。    站在知識分享的立場,希望參考程式碼的時候能自己瞭解,不要照單全收(畢竟這將是我論文的一小部份)。說不定我寫錯了,還請各位先進不吝賜教。 ------------------------------------------------------------------- 參考資料:    [1] 鍾國亮,影像處理與電腦視覺,台灣東華書局股份有限公司,民國91年,pp.84-88 [2] N. Otsu, "A Threshold Selection Method from Gray-Level Histograms," IEEE Transactions on Systems, Man, and Cybernetics, vol. 9, no. 1, pp. 62-66, 1979. [3] "graythresh", MATLAB Image Processing Toolbox ------------------------------------------------------------------- 函數說明:利用Otsu演算求二值化門檻值 參數傳入:TBitmap 物件指標(其PixelFormat = pf8bit) 參數傳回:int 最佳門檻值 -------------------------------------------------------------------
// Otsu法求最佳門檻值(256灰階) FUNCTION
int __fastcall TFormMain::OtsuAlgorithm(Graphics::TBitmap *pRefBitmap)
{
  // **** 變數說明 ****
  // N              影像的尺寸(總像素數)
  // n[i]           影像中灰階值為i的像素數
  // P[i]           影像中灰階值為i的像素所出現的機率
  //
  // 當門檻值為i時
  // Sum_Pi[i]      影像中第一群像素(C1)所佔的比率 =W1
  // W2             影像中第二群像素(C2)所佔的比率 =1-W1
  // Sum_Pi_i[i]    SUM(T=0 to i,P[i]*i)
  // U1             C1的期望值 =Sum_Pi_i[i]/W1
  // U2             C2的期望值 =(Sum_Pi_i[255]-Sum_Pi_i[i])/W2
  // Sigma_1_square C1的變異數
  // Sigma_2_square C2的變異數
  // Sigma_w_square C1和C2的變異數和      int    row, col;
  int    i, T;
  double N, n[256], P[256], Sum_Pi[256] ,Sum_Pi_i[256];
  double W1, W2, U1, U2;
  double Sigma_1_square, Sigma_2_square, Sigma_w_square;
  double MinVariance = (double)(1.7e 308);
  Byte   *ptr;
  int    T_optimal = 0;      // 計算影像的總像素數
  N = (double)pRefBitmap->Width * pRefBitmap->Height;      // 統計影像中灰階值為i的像素數
  for(i = 0; i < 256 ; i  )
    n[i] = 0;
  for(row = 0; row < pRefBitmap->Height; row  )
  {
    ptr = (Byte *)pRefBitmap->ScanLine[row];
    for(col = 0; col < pRefBitmap->Width; col  )
      n[ ptr[col] ]  ;
  }      // 計算影像中灰階值為i的像素所出現的機率
  for(i = 0; i < 256; i  )
    P[i] = n[i] / N;      // 分別計算門檻值為T時,Sum_Pi和Sum_Pi_i
  Sum_Pi[0]   = P[0];
  Sum_Pi_i[0] = 0;
  for(i = 1; i < 256; i  )
  {
    Sum_Pi[i]   = Sum_Pi[i-1]   P[i];
    Sum_Pi_i[i] = Sum_Pi_i[i-1]   P[i] * i;
  }      // 檢查所有的灰階值,使C1和C2的變異數和為最小時
  // 即為所求的最佳門檻值
  for(T = 1; T <= 254; T  )
  {
    W1 = Sum_Pi[T];
    // 加上最小值檢查,避免除數為零
    if(fabs(W1) < 1e-9)
      W1 = 1e-9;        W2 = 1 - W1;
    // 加上最小值檢查,避免除數為零
    if(fabs(W2) < 1e-9)
      W2 = 1e-9;        U1 = Sum_Pi_i[T] / W1;
    U2 = (Sum_Pi_i[255] - Sum_Pi_i[T]) / W2;        Sigma_1_square = 0;
    for(i = 0; i <= T; i  )
      Sigma_1_square  = ((double)i - U1) * ((double)i - U1) * P[i];
    Sigma_1_square = Sigma_1_square / W1;        Sigma_2_square = 0;
    for(i = T 1; i <= 255; i  )
      Sigma_2_square  = ((double)i - U2) * ((double)i - U2) * P[i];
    Sigma_2_square = Sigma_2_square / W2;        Sigma_w_square = W1 * Sigma_1_square   W2 * Sigma_2_square;        if(Sigma_w_square < MinVariance)
    {
      MinVariance = Sigma_w_square;
      T_optimal = T;
    }
  }      // 回傳最佳門檻值
  return T_optimal;
} 
發表人 - arisaka_matsuri 於 2003/11/25 22:43:38
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-11-25 13:37:50 IP:140.135.xxx.xxx 未訂閱
arisaka_matsuri您好: 謝謝您熱心的分享< > 順心< >
m58610
初階會員


發表:22
回覆:83
積分:36
註冊:2003-09-07

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-11-28 19:11:51 IP:211.76.xxx.xxx 未訂閱
先前作的程式.. 不過不符合我使用..ㄏㄏ [1] 鍾國亮,影像處理與電腦視覺,台灣東華書局股份有限公司,民國91年,pp.84-88 我也是參考上面這本書寫的... 他在我學校資工系有開課...所以學長推薦我買他的書 程式有Otsu跟Kapur演算法... 我想應該沒有錯誤...裡面有一些變異數..或是期望值方面的統計學不好懂 當時我有問學商的老師... 所以才寫出來的...提供給大家    已經上傳至貴站的發表區了..thx  
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=41269
 
發表人 - m58610 於 2003/11/28 23:06:21
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-11-28 21:22:21 IP:140.135.xxx.xxx 未訂閱
m58610您好: 您可以將您的大作放置下面的連結喔 http://delphi.ktop.com.tw/forum.asp?FORUM_ID=79 會員作品發表區 p.s:感謝您的分享 順心
pusong
一般會員


發表:2
回覆:7
積分:1
註冊:2003-02-27

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-12-06 22:31:35 IP:140.122.xxx.xxx 未訂閱
arisaka_matsuri大大 及各位大大好 請問在arisaka_matsuri發表文章中   double MinVariance = (double)(1.7e+308);    為何要把MinVariance設到1.7e308呢?(設這麼大? 這值如何得到的?) > 感謝大大的回應
arisaka_matsuri
高階會員


發表:25
回覆:205
積分:231
註冊:2003-10-19

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-12-07 10:23:53 IP:218.166.xxx.xxx 未訂閱
pusong 你好:    double MinVariance = (double)(1.7e+308); 這是double型態的最大值 既然要求兩群之C1和C2的變異數和為最小 一開始就指定一個最大值來慢慢比囉~ < class="code"> if(Sigma_w_square < MinVariance) { MinVariance = Sigma_w_square; T_optimal = T; } 也就是這段程式意思 另外,書上提到可分K群,我是沒有用到,所以就不管了
pusong
一般會員


發表:2
回覆:7
積分:1
註冊:2003-02-27

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-12-08 22:32:45 IP:140.122.xxx.xxx 未訂閱
arisaka_matsuri您好:    瞭解~~ 可否再問一個問題呢
arisaka_matsuri
高階會員


發表:25
回覆:205
積分:231
註冊:2003-10-19

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-12-09 13:42:47 IP:163.28.xxx.xxx 未訂閱
pusong 你好:
引言: Sum_Pi[0] = P[0]; Sum_Pi_i[0] = 0; 這兩行的意思是什麼呢? 把陣列歸零嗎?
這兩行不是歸零,只是設定初值,因為之後的for-loop會用到(可以研究一下)
phorn
一般會員


發表:28
回覆:60
積分:17
註冊:2004-03-03

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-07-26 14:57:35 IP:210.244.xxx.xxx 未訂閱
請位一下???我知道公式也是寫這樣,但是簡化後可以消掉,有人知道他的用意何在嗎???謝謝!! >> >> <>>
sunweb
一般會員


發表:11
回覆:9
積分:4
註冊:2006-07-06

發送簡訊給我
#14 引用回覆 回覆 發表時間:2008-04-10 15:59:29 IP:61.218.xxx.xxx 訂閱
裡頭使用到的全域變數便是各代表甚麼意思,完全猜不透,可能是我太笨了
不曉得是否有哪位大大使用成功,可否賜教....最近一直在找多閥值的程式,這個程式還蠻實用的
只是無法理解裡頭意義
以下是我找到的變數定義,只是不了解其意義,還請指點迷津,otsu的定義原理是懂,但還是看不懂內容
/* Otsu 演算法 */
/* 輸入 */
/* k:代表分群群數,即為預求門檻數加1 */
/* 使用到的global變數 */
/* thresholds[]:存放相對於compact histogram之index的門檻值 */
/* Index[i]:代表compact histogram index i相對應之灰階值 */
/* Sum_H[]: compact histogram H[]的累加個數陣列;Sum_H[i] =H[i] Sum_H[i-1] */
/* Sum_i[]: 累加灰階值乘上個數陣列;Sum_i[i] = Index[i]*H[i] Sum_i[i-1] */
/* Sum_i2[]: 累加灰階值平方乘上個數陣列 */
/* Sum_i2[i] =Index[i]*Index[i]*H[i] Sum_i2[i-1] */

/* 輸出 */
/* Min_thresholds[]:代表求得的thresholds值(相對於histogram),在程式過程中存暫時 */
/* 求得的thresholds compact histogram index值 */

===================引 用 JerryKuo 文 章===================
你好: bcb也可以相容c語言的程式,c需要的函式庫,bcb裡都有,所以由c轉bcb是不需要改什麼參數,只是如果要秀出資料,就需要用一些bcb元件才行,不過Ostu()並沒有printf(),所以直接呼叫就可以使用,只是有一些全域變數要事先宣告,應該就能直接使用。 從Ostu(int k)這個程式來看,有一些變數是全域變數,因為沒有看到宣告,這幾個變數你應該最清楚,要把這些變數宣告成全域變數,這個程式就能使用。
thresholds[ ]    <- 臨界值矩陣?
Sum_H[ ]         <-  ?
Sum_i[ ]         <-  ?
Sum_i2[ ]        <-  ?
Min_thresholds[ ]<-  ?
發表人 - jerrykuo 於 2003/11/10 09:43:57
編輯記錄
sunweb 重新編輯於 2008-04-10 16:49:02, 註解 無‧
dicky9055
一般會員


發表:20
回覆:48
積分:18
註冊:2006-08-02

發送簡訊給我
#15 引用回覆 回覆 發表時間:2008-04-16 09:11:23 IP:203.79.xxx.xxx 訂閱
建議你可以參考
arisaka_matsuri
所寫的...然後再配合原理一起看
應就會知道各代表什麼意思了
我當時也是參考這位大大寫出來的

===================引 用 sunweb 文 章===================
裡頭使用到的全域變數便是各代表甚麼意思,完全猜不透,可能是我太笨了
不曉得是否有哪位大大使用成功,可否賜教....最近一直在找多閥值的程式,這個程式還蠻實用的
只是無法理解裡頭意義
以下是我找到的變數定義,只是不了解其意義,還請指點迷津,otsu的定義原理是懂,但還是看不懂內容
/* Otsu 演算法 */
/* 輸入 */
/* k:代表分群群數,即為預求門檻數加1 */
/* 使用到的global變數 */
/* thresholds[]:存放相對於compact histogram之index的門檻值 */
/* Index[i]:代表compact histogram index i相對應之灰階值 */
/* Sum_H[]: compact histogram H[]的累加個數陣列;Sum_H[i] =H[i] Sum_H[i-1] */
/* Sum_i[]: 累加灰階值乘上個數陣列;Sum_i[i] = Index[i]*H[i] Sum_i[i-1] */
/* Sum_i2[]: 累加灰階值平方乘上個數陣列 */
/* Sum_i2[i] =Index[i]*Index[i]*H[i] Sum_i2[i-1] */

/* 輸出 */
/* Min_thresholds[]:代表求得的thresholds值(相對於histogram),在程式過程中存暫時 */
/* 求得的thresholds compact histogram index值 */

===================引 用 JerryKuo 文 章===================
你好: bcb也可以相容c語言的程式,c需要的函式庫,bcb裡都有,所以由c轉bcb是不需要改什麼參數,只是如果要秀出資料,就需要用一些bcb元件才行,不過Ostu()並沒有printf(),所以直接呼叫就可以使用,只是有一些全域變數要事先宣告,應該就能直接使用。 從Ostu(int k)這個程式來看,有一些變數是全域變數,因為沒有看到宣告,這幾個變數你應該最清楚,要把這些變數宣告成全域變數,這個程式就能使用。
thresholds[ ]    <- 臨界值矩陣?
Sum_H[ ]         <-  ?
Sum_i[ ]         <-  ?
Sum_i2[ ]        <-  ?
Min_thresholds[ ]<-  ?
發表人 - jerrykuo 於 2003/11/10 09:43:57
系統時間:2024-12-05 3:25:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!