關於Otsu二值化的程式 |
尚未結案
|
supy
一般會員 發表:2 回覆:2 積分:0 註冊:2003-08-05 發送簡訊給我 |
請問各位高手,小弟手邊有一個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 |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
supy您好:
請參考下面聯結讓您的程式碼更方便閱讀
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=39722
謝謝您的配合 > 發表人 -
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
你好: 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 發送簡訊給我 |
|
arisaka_matsuri
高階會員 發表:25 回覆:205 積分:231 註冊:2003-10-19 發送簡訊給我 |
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 發送簡訊給我 |
|
m58610
初階會員 發表:22 回覆:83 積分:36 註冊:2003-09-07 發送簡訊給我 |
先前作的程式..
不過不符合我使用..ㄏㄏ
[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 發送簡訊給我 |
m58610您好:
您可以將您的大作放置下面的連結喔
http://delphi.ktop.com.tw/forum.asp?FORUM_ID=79
會員作品發表區 p.s:感謝您的分享 順心
|
pusong
一般會員 發表:2 回覆:7 積分:1 註冊:2003-02-27 發送簡訊給我 |
|
arisaka_matsuri
高階會員 發表:25 回覆:205 積分:231 註冊:2003-10-19 發送簡訊給我 |
|
pusong
一般會員 發表:2 回覆:7 積分:1 註冊:2003-02-27 發送簡訊給我 |
|
arisaka_matsuri
高階會員 發表:25 回覆:205 積分:231 註冊:2003-10-19 發送簡訊給我 |
|
phorn
一般會員 發表:28 回覆:60 積分:17 註冊:2004-03-03 發送簡訊給我 |
|
sunweb
一般會員 發表:11 回覆:9 積分:4 註冊:2006-07-06 發送簡訊給我 |
裡頭使用到的全域變數便是各代表甚麼意思,完全猜不透,可能是我太笨了
不曉得是否有哪位大大使用成功,可否賜教....最近一直在找多閥值的程式,這個程式還蠻實用的 只是無法理解裡頭意義 以下是我找到的變數定義,只是不了解其意義,還請指點迷津,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 發送簡訊給我 |
建議你可以參考
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 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |