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

OTSU二值化的問題

 
dicky9055
一般會員


發表:20
回覆:48
積分:18
註冊:2006-08-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-11-21 10:33:11 IP:211.76.xxx.xxx 未訂閱
下面是我參考站上某位大大的程式所改的
但不知為何...我執行一次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;rowHeight;row )
{
ptr=(Byte *)Bmp->ScanLine[row];
for (col=0;colWidth;col )
n[ptr[col]] ;
}
// 計算影像中灰階值為i的像素所出現的機率
for (i=0;i<=255;i )
P[i]=n[i]/N;

for(j=0;jHeight;j )
{
ptr = (Byte *)Bmp->ScanLine[j];
for(i=0;iWidth;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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-12-12 17:11:06 IP:140.125.xxx.xxx 未訂閱
可以透過已簡化之Otus演算法來加快速度,
而非直接使用概念上之意義
------
=.=???
系統時間:2024-05-12 14:18:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!