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

請問OTSU二值化法之原理

尚未結案
mize
一般會員


發表:2
回覆:0
積分:0
註冊:2004-11-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-16 19:37:21 IP:140.117.xxx.xxx 未訂閱
請問各位大大: 請問是否有人可以可以解釋OTSU法的原理,也就是其物理意義。 很急~希望各位善心的大大可以回答我,謝謝。
yangkissktop
一般會員


發表:13
回覆:29
積分:8
註冊:2003-10-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-24 02:39:08 IP:221.169.xxx.xxx 未訂閱
把他想成是一根會動的分界線T在直方圖中由左至右移動 每次比較兩群新分割 群組之變異數 便可得到最佳的T值 ------------------------------------------------------------------- 函數說明:利用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; } yangkissktop
------
yangkissktop
yangkissktop
一般會員


發表:13
回覆:29
積分:8
註冊:2003-10-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-24 02:44:48 IP:221.169.xxx.xxx 未訂閱
對不起! 社區網路塞車 一下子壓太多次 煩請版主將多餘的文章刪除 麻煩您 yangkissktop
------
yangkissktop
1666362
初階會員


發表:66
回覆:124
積分:43
註冊:2004-07-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-01-05 00:10:33 IP:210.192.xxx.xxx 未訂閱
dear yangkissktop 如果我要的是把 T這調準線 移動到 第二個波峰的右邊 也是您貼的圖的右邊 不想把T介定在中間 請問 程式碼 要如何修正呢? 我是新手 多多指教 ^^
arisaka_matsuri
高階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-01-05 17:04:22 IP:140.113.xxx.xxx 未訂閱
版主大人明鑑:    本人在此提出嚴重的抗議! yangkissktop 所貼出的程式碼為本人發表在此討論區中的http://delphi.ktop.com.tw/topic.php?TOPIC_ID=40261程式碼,但引用時未加上明顯的出處來源,有誤導與摽竊之嫌!
yangkissktop
一般會員


發表:13
回覆:29
積分:8
註冊:2003-10-25

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-01-07 00:53:14 IP:221.169.xxx.xxx 未訂閱
本人在此正式向arisaka_matsuri兄公開道歉: 事件原委: 某凌晨趕軟體之過程中,因一時需要至KTOP查程式碼,偶然看到懸賞題,一時興起,便將指導碩士班同學蒐集之眾多技術文件擇一貼出,幸甚將近二週後舊地重遊(有時半年才有空上一次),否則背上剽竊污名而不自知,於此再向arisaka_matsuri兄公開抱歉,日後個人貼文字當注意“發表”、“引用”等字眼,希望arisaka_matsuri兄本個人傳播知識之善意予以原諒。 yangkissktop
------
yangkissktop
arisaka_matsuri
高階會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-01-07 11:16:16 IP:140.113.xxx.xxx 未訂閱
yangkissktop: 你的道歉我欣然接受,也不再追究。
系統時間:2024-05-21 0:59:50
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!