OTSU二值化的問題 |
|
dicky9055
一般會員 發表:20 回覆:48 積分:18 註冊:2006-08-02 發送簡訊給我 |
下面是我參考站上某位大大的程式所改的
但不知為何...我執行一次otsu需要很久的時間..大一點的圖約要十分鐘 還有..結果都會變成黑色 不知是那裡出了問題 請各大大幫我解答一下 謝 nt __fastcall TForm1::Otsu(int OtsuT, Graphics::TBitmap *Bmp, double* P) { //Graphics::TBitmap *Bmp = new Graphics::TBitmap(); int row,col; int i,T; double N,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 影像的尺寸(總像素數) // 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的變異數和 //Bmp->Assign(Image1->Picture->Bitmap); // 分別計算門檻值為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; } for(T = 1; T <= 254; T ) //避開0和255的部分 { W1 = Sum_Pi[T]; // 加上最小值檢查,避免除數為零 if(fabs(W1) < 1e-9)//1e-9=10^-9=0.000000001 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; // U2 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; // Sigma_w_square if(Sigma_w_square < MinVariance) { MinVariance = Sigma_w_square; T_optimal = T; } } // delete Bmp; // 回傳最佳門檻值 return T_optimal; } void __fastcall TForm1::Otsu1Click(TObject *Sender) { Graphics::TBitmap *Bmp = new Graphics::TBitmap(); Byte *ptr; int r,g,b; int gray; int i,j; int threshold; int row,col,N; double n[256],P[256]; Bmp->Assign(Image1->Picture->Bitmap); // 計算影像的總像素數 // N=(double)Image1->Width*Image1->Height; // 統計影像中灰階值為i的像素數 for (i=0;i<=255;i ) n[i]=0; // for (row=0;row { ptr=(Byte *)Bmp->ScanLine[row]; for (col=0;col n[ptr[col]] ; } // 計算影像中灰階值為i的像素所出現的機率 for (i=0;i<=255;i ) P[i]=n[i]/N; for(j=0;j { ptr = (Byte *)Bmp->ScanLine[j]; for(i=0;i { Otsu(threshold, Bmp ,P); if(gray>threshold) gray=255; else gray=0; ptr[i*3]=(Byte)gray; ptr[i*3 1]=(Byte)gray; ptr[i*3 2]=(Byte)gray; } } Image1->Picture->Assign(Bmp); delete Bmp; } |
CoffeeX
中階會員 發表:18 回覆:121 積分:72 註冊:2005-02-18 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |