全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1455
推到 Plurk!
推到 Facebook!

請問關於精華區的Ostu二值化程式碼.....

缺席
xdio2
一般會員


發表:60
回覆:29
積分:17
註冊:2004-07-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-23 02:01:24 IP:61.59.xxx.xxx 未訂閱
想請問一下各位 另外跟arisaka_matsuri問候一下, 小弟有好幾次的疑惑都靠您熱心解決,在此感謝一下    (1) 小弟現在想問一下關於Ostu二值化 arisaka_matsuri大大範例碼的問題 我把範例貼在底下,有問題的地方用紅色表達 小弟實在看不太懂一開始 對Sum_pi跟Sum_pi_i這兩個陣列的注解 根據下面的迴圈, 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; }    小弟覺得 所謂的Sum_pi就是指把某i灰階值當成門檻值, 比此門檻值小的灰階值總共出現的機率 而Sum_pi_i則是求此低於門檻值的灰階期望值 以上對於Sum_pi & Sum_pi_i的解釋正確嗎?    (2) U1 = Sum_Pi_i[T] / W1; U2 = (Sum_Pi_i[255] - Sum_Pi_i[T]) / W2;    上面的U1 & U2指的是什麼呢? 註解上說是期望值...可是我不知道是什麼期望值 U1可以拆成U1=(Sum_pi_pi)/(Sum_pi) 這個把期望值又拿來除灰階機率... 我實在看不太懂,小弟程式碼目前看到這個位置 請大大們解惑一下,感謝~    
// 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;
}
 
xdio2
一般會員


發表:60
回覆:29
積分:17
註冊:2004-07-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-23 22:10:54 IP:61.59.xxx.xxx 未訂閱
沒人可以幫幫我解答嗎? 拜託各位大大替我解惑一下... 感謝~
系統時間:2024-05-14 15:40:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!