請問關於精華區的Ostu二值化程式碼..... |
缺席
|
xdio2
一般會員 發表:60 回覆:29 積分:17 註冊:2004-07-23 發送簡訊給我 |
想請問一下各位
另外跟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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |