連續框取平均值 |
答題得分者是:ikk
|
913028
一般會員 發表:30 回覆:41 積分:19 註冊:2008-06-24 發送簡訊給我 |
各位大大好: 以下程式碼是我要對圖上連續黃色框框做處理,它會將圖上灰階圖裡取連續框框,在這我只取一個做樣品,現在可以取得R G B三個值,但是,我要的是每個區塊裡的灰階值做相加取平均,並取得其連續黃色區的平均值,所以正常來說大約會有10個平均值,可是我的程式碼現在是變成取整張圖的灰階值在除20*20去做平均,不知那個環節有問題? 煩請各位大大幫忙 感謝 [code cpp] int X=200; int Y=20; int x_Get = 20; int y_Get = 20; int X_loop = X/x_Get; int Y_loop = Y/y_Get; int Left_Start = 0; int Top_Start = 0; BYTE r; BYTE g; BYTE b; char Msg[128]; int aveR=0, aveG=0, aveB=0; int aveR1, aveG1, aveB1; for(int i=0; i for(int ix=(Left_Start i * x_Get);ix<(Left_Start (i 1) * x_Get);ix )//灰階範圍 for(int iy= (Top_Start j * y_Get);iy<(Top_Start (j 1) * y_Get);iy ) { Image1->Canvas->Rectangle( Left_Start i * x_Get, Top_Start j * y_Get, Left_Start (i 1) * x_Get, Top_Start (j 1) * y_Get); r = GetRValue(Image1->Canvas->Pixels[ix][iy]); g = GetGValue(Image1->Canvas->Pixels[ix][iy]); b = GetBValue(Image1->Canvas->Pixels[ix][iy]); aveR =aveR r; aveG =aveG g; aveB =aveB b; aveR1 =aveR/(20*20); aveG1 =aveG/(20*20); aveB1 =aveB/(20*20); sprintf(Msg,"R(%d) G(%d) B(%d)", r, g, b); Memo2->Lines->Add(Msg); Memo2->Lines->Add(aveR1); Memo2->Lines->Add(aveG1); Memo2->Lines->Add(aveB1); } }[/code]
------
新手報到 編輯記錄
913028 重新編輯於 2009-03-30 00:08:35, 註解 無‧
|
ikk
尊榮會員 發表:4 回覆:413 積分:768 註冊:2003-06-30 發送簡訊給我 |
|
913028
一般會員 發表:30 回覆:41 積分:19 註冊:2008-06-24 發送簡訊給我 |
|
ikk
尊榮會員 發表:4 回覆:413 積分:768 註冊:2003-06-30 發送簡訊給我 |
[code cpp] int avg_R_List[100]; int avg_G_List[100]; int avg_B_List[100]; for(int i=0; i aveR = 0; aveG = 0; aveB = 0; for(int j=0; j ... aveR =aveR r; aveG =aveG g; aveB =aveB b; //aveR1 =aveR/(20*20); //aveG1 =aveG/(20*20); //aveB1 =aveB/(20*20); ... } avg_R_List[i] = aveR/(20*20); avg_G_List[i] = aveG/(20*20); avg_B_List[i] = aveB/(20*20); } [/code]
------
FPGA驗證, FPGA開發平台, http://smims.com
編輯記錄
ikk 重新編輯於 2009-03-30 14:26:53, 註解 無‧
|
913028
一般會員 發表:30 回覆:41 積分:19 註冊:2008-06-24 發送簡訊給我 |
===================引 用 ikk 文 章=================== [code cpp] int avg_R_List[100]; int avg_G_List[100]; int avg_B_List[100]; for(int i=0; i{ aveR = 0; aveG = 0; aveB = 0; for(int j=0; j { ... aveR =aveR r; aveG =aveG g; aveB =aveB b; //aveR1 =aveR/(20*20); //aveG1 =aveG/(20*20); //aveB1 =aveB/(20*20); ... } avg_R_List[i] = aveR/(20*20); avg_G_List[i] = aveG/(20*20); avg_B_List[i] = aveB/(20*20); } [/code] ========================================= ikk大大你好: 我加入底下迴圈裡aveR = 0; aveG = 0; aveB = 0; 就可顯現,還有 加入這個寫法avg_R_List[i]我要怎麼把這些i裡面的平均值顯現在Memo2->Lines->Add()呢? 感謝 [code cpp] int X=200; int Y=20; int x_Get = 20; int y_Get = 20; int X_loop = X/x_Get; int Y_loop = Y/y_Get; int Left_Start = 0; int Top_Start = 0; BYTE r; BYTE g; BYTE b; char Msg[128]; int aveR=0, aveG=0, aveB=0; int aveR1, aveG1, aveB1; for(int i=0; i aveR = 0; aveG = 0; aveB = 0; for(int ix=(Left_Start i * x_Get);ix<(Left_Start (i 1) * x_Get);ix )//灰階範圍 for(int iy= (Top_Start j * y_Get);iy<(Top_Start (j 1) * y_Get);iy ) { Image1->Canvas->Rectangle( Left_Start i * x_Get, Top_Start j * y_Get, Left_Start (i 1) * x_Get, Top_Start (j 1) * y_Get); r = GetRValue(Image1->Canvas->Pixels[ix][iy]); g = GetGValue(Image1->Canvas->Pixels[ix][iy]); b = GetBValue(Image1->Canvas->Pixels[ix][iy]); aveR =aveR r; aveG =aveG g; aveB =aveB b; sprintf(Msg,"R(%d) G(%d) B(%d)", r, g, b); Memo2->Lines->Add(Msg); } aveR1 =aveR/(20*20); aveG1 =aveG/(20*20); aveB1 =aveB/(20*20); Memo2->Lines->Add(aveR1); Memo2->Lines->Add(aveG1); Memo2->Lines->Add(aveB1); } [/code]
------
新手報到 |
ikk
尊榮會員 發表:4 回覆:413 積分:768 註冊:2003-06-30 發送簡訊給我 |
[code cpp] for(int i=0; i sprintf(Msg,"avg_R_List[%d] = (%d), avg_G_List[%d] = (%d), avg_B_List[%d] = (%d)", i, avg_R_List[i], i, avg_G_List[i], i, avg_B_List[i]); Memo2->Lines->Add(Msg); } [/code]
------
FPGA驗證, FPGA開發平台, http://smims.com
編輯記錄
ikk 重新編輯於 2009-03-30 16:33:56, 註解 無‧
|
913028
一般會員 發表:30 回覆:41 積分:19 註冊:2008-06-24 發送簡訊給我 |
===================引 用 ikk 文 章=================== [code cpp] for(int i=0; i{ sprintf(Msg,"avg_R_List[%d] = (%d), avg_G_List[%d] = (%d), avg_B_List[%d] = (%d)", i, avg_R_List[i], i, avg_G_List[i], i, avg_B_List[i]); Memo2->Lines->Add(Msg); } [/code] ================================================= ikk大大你好: 已可使用感謝。 在請問一下,我把各自區塊裡的灰階值去減掉自己區塊所平均得出的平均值,如:zeromeanR=r-aveR1[i]; zeromeanG=g-aveR1[i]; zeromeanB=b-aveR1[i];這個做完後我要將這個結果處理在圖上,現在不知要如何著手? 麻煩大大 [code cpp] int X=200; int Y=20; int x_Get = 20; int y_Get = 20; int X_loop = X/x_Get; int Y_loop = Y/y_Get; int Left_Start = 0; int Top_Start = 0; BYTE r; BYTE g; BYTE b; char Msg[128]; int aveR=0, aveG=0, aveB=0; int aveR1[100], aveG1[100], aveB1[100]; int zeromeanR,zeromeanG,zeromeanB; for(int i=0; i aveR = 0; aveG = 0; aveB = 0; for(int ix=(Left_Start i * x_Get);ix<(Left_Start (i 1) * x_Get);ix )//灰階範圍 for(int iy= (Top_Start j * y_Get);iy<(Top_Start (j 1) * y_Get);iy ) { Image1->Canvas->Rectangle( Left_Start i * x_Get, Top_Start j * y_Get, Left_Start (i 1) * x_Get, Top_Start (j 1) * y_Get); r = GetRValue(Image1->Canvas->Pixels[ix][iy]); g = GetGValue(Image1->Canvas->Pixels[ix][iy]); b = GetBValue(Image1->Canvas->Pixels[ix][iy]); aveR =aveR r; aveG =aveG g; aveB =aveB b; sprintf(Msg,"R(%d) G(%d) B(%d)", r, g, b); Memo2->Lines->Add(Msg); } aveR1[i] =aveR/(20*20); aveG1[i] =aveG/(20*20); aveB1[i] =aveB/(20*20); Memo2->Lines->Add(aveR1); Memo2->Lines->Add(aveG1); Memo2->Lines->Add(aveB1); zeromeanR=r-aveR1[i]; zeromeanG=g-aveR1[i]; zeromeanB=b-aveR1[i]; } [/code]
------
新手報到 |
ikk
尊榮會員 發表:4 回覆:413 積分:768 註冊:2003-06-30 發送簡訊給我 |
|
913028
一般會員 發表:30 回覆:41 積分:19 註冊:2008-06-24 發送簡訊給我 |
ikk大大你好:
我要在黃色區塊內的各灰階值,減去在此區塊所得的平均值,並顯現出新的黃色區塊的灰階值,我的寫法為: zeromeanR[i]=r-aveR1[i]; zeromeanG[i]=g-aveR1[i]; zeromeanB[i]=b-aveR1[i]; 但是下斷點所顯現的,卻是只有最後一個相減的值,請問要如何才能顯現黃色區塊的新灰階值呢? PS:因為要把這些值處理到黃色區塊,還是沒頭緒。 感謝 [code cpp] int X=200; int Y=20; int x_Get = 20; int y_Get = 20; int X_loop = X/x_Get; int Y_loop = Y/y_Get; int Left_Start = 0; int Top_Start = 0; BYTE r; BYTE g; BYTE b; char Msg[128]; int aveR=0, aveG=0, aveB=0; int aveR1[100], aveG1[100], aveB1[100]; int zeromeanR[100],zeromeanG[100],zeromeanB[100]; for(int i=0; i aveR = 0; aveG = 0; aveB = 0; for(int ix=(Left_Start i * x_Get);ix<(Left_Start (i 1) * x_Get);ix )//灰階範圍 for(int iy= (Top_Start j * y_Get);iy<(Top_Start (j 1) * y_Get);iy ) { Image1->Canvas->Rectangle( Left_Start i * x_Get, Top_Start j * y_Get, Left_Start (i 1) * x_Get, Top_Start (j 1) * y_Get); r = GetRValue(Image1->Canvas->Pixels[ix][iy]); g = GetGValue(Image1->Canvas->Pixels[ix][iy]); b = GetBValue(Image1->Canvas->Pixels[ix][iy]); aveR =aveR r; aveG =aveG g; aveB =aveB b; sprintf(Msg,"R(%d) G(%d) B(%d)", r, g, b); Memo2->Lines->Add(Msg); } aveR1[i] =aveR/(20*20); aveG1[i] =aveG/(20*20); aveB1[i] =aveB/(20*20); Memo2->Lines->Add(aveR1); Memo2->Lines->Add(aveG1); Memo2->Lines->Add(aveB1); zeromeanR[i]=r-aveR1[i]; zeromeanG[i]=g-aveR1[i]; zeromeanB[i]=b-aveR1[i]; } [/code]
------
新手報到
編輯記錄
913028 重新編輯於 2009-03-31 11:02:49, 註解 無‧
|
ikk
尊榮會員 發表:4 回覆:413 積分:768 註冊:2003-06-30 發送簡訊給我 |
|
913028
一般會員 發表:30 回覆:41 積分:19 註冊:2008-06-24 發送簡訊給我 |
===================引 用 ikk 文 章=================== ??? [code cpp] zeromeanR[i]=r-aveR1[i]; zeromeanG[i]=g-aveG1[i]; zeromeanB[i]=b-aveB1[i]; [/code] ================================================ ikk大大你好: 我是要把黃色區塊裡的r g b灰階像素值,減去黃色區塊所得的平均值aveR1[i] aveG1[i] aveB1 ,在把這些新的灰階值顯現在zeromeanR[i] zeromeanG[i] zeromeanB[i],做零平均處理。 不知這樣的寫法對嗎?
------
新手報到 |
ikk
尊榮會員 發表:4 回覆:413 積分:768 註冊:2003-06-30 發送簡訊給我 |
|
913028
一般會員 發表:30 回覆:41 積分:19 註冊:2008-06-24 發送簡訊給我 |
|
ikk
尊榮會員 發表:4 回覆:413 積分:768 註冊:2003-06-30 發送簡訊給我 |
|
913028
一般會員 發表:30 回覆:41 積分:19 註冊:2008-06-24 發送簡訊給我 |
===================引 用 ikk 文 章=================== 你有試過寫入嗎?? code ? ================================================ ikk大大你好: 我執行到以下程式時,都只出現最後一位灰階值減去平均值的數值 [code cpp] zeromeanR[i]=r-aveR1[i]; zeromeanG[i]=g-aveG1[i]; zeromeanB[i]=b-aveB1[i]; [/code] 我是用底下來看的,先看R的。 [code cpp] sprintf(Msg555,"zeromeanR[%d](%d) ",i, zeromeanR[i]); Memo2->Lines->Add(Msg555); [/code]
------
新手報到
編輯記錄
913028 重新編輯於 2009-03-31 14:58:31, 註解 無‧
|
ikk
尊榮會員 發表:4 回覆:413 積分:768 註冊:2003-06-30 發送簡訊給我 |
|
913028
一般會員 發表:30 回覆:41 積分:19 註冊:2008-06-24 發送簡訊給我 |
|
ikk
尊榮會員 發表:4 回覆:413 積分:768 註冊:2003-06-30 發送簡訊給我 |
|
913028
一般會員 發表:30 回覆:41 積分:19 註冊:2008-06-24 發送簡訊給我 |
|
ikk
尊榮會員 發表:4 回覆:413 積分:768 註冊:2003-06-30 發送簡訊給我 |
[code cpp] for(int ix=(Left_Start i * x_Get);ix<(Left_Start (i 1) * x_Get);ix ) { for(int iy= (Top_Start j * y_Get);iy<(Top_Start (j 1) * y_Get);iy ) { r = GetRValue(Image1->Canvas->Pixels[ix][iy]); g = GetGValue(Image1->Canvas->Pixels[ix][iy]); b = GetBValue(Image1->Canvas->Pixels[ix][iy]); r -= aveR1[i]; g -= aveG1[i]; b -= aveB1[i]; Image1->Canvas->Pixels[ix][iy] = (TColor)RGB(r,g,b); } } [/code]
------
FPGA驗證, FPGA開發平台, http://smims.com |
913028
一般會員 發表:30 回覆:41 積分:19 註冊:2008-06-24 發送簡訊給我 |
ikk大大你好:
我把程式碼貼在*字範圍的地方,但是,執行時為什麼都會變成,有些方塊是彩色的有些則是有雜訊黑白的,正常來講會變成方塊是灰階且明亮度不同,不知是那個環節又出現問題了。 麻煩大大 [code cpp] int X=200; int Y=20; int x_Get = 20; int y_Get = 20; int X_loop = X/x_Get; int Y_loop = Y/y_Get; int Left_Start = 0; int Top_Start = 0; BYTE r; BYTE g; BYTE b; char Msg[128]; int aveR=0, aveG=0, aveB=0; int aveR1[100], aveG1[100], aveB1[100]; int zeromeanR,zeromeanG,zeromeanB; for(int i=0; i aveR = 0; aveG = 0; aveB = 0; for(int ix=(Left_Start i * x_Get);ix<(Left_Start (i 1) * x_Get);ix )//灰階範圍 for(int iy= (Top_Start j * y_Get);iy<(Top_Start (j 1) * y_Get);iy ) { Image1->Canvas->Rectangle( Left_Start i * x_Get, Top_Start j * y_Get, Left_Start (i 1) * x_Get, Top_Start (j 1) * y_Get); r = GetRValue(Image1->Canvas->Pixels[ix][iy]); g = GetGValue(Image1->Canvas->Pixels[ix][iy]); b = GetBValue(Image1->Canvas->Pixels[ix][iy]); aveR =aveR r; aveG =aveG g; aveB =aveB b; sprintf(Msg,"R(%d) G(%d) B(%d)", r, g, b); Memo2->Lines->Add(Msg); } * for(int ix=(Left_Start i * x_Get);ix<(Left_Start (i 1) * x_Get);ix ) { for(int iy= (Top_Start j * y_Get);iy<(Top_Start (j 1) * y_Get);iy ) { r = GetRValue(Image1->Canvas->Pixels[ix][iy]); g = GetGValue(Image1->Canvas->Pixels[ix][iy]); b = GetBValue(Image1->Canvas->Pixels[ix][iy]); r -= aveR1[i]; g -= aveG1[i]; b -= aveB1[i]; Image1->Canvas->Pixels[ix][iy] = (TColor)RGB(r,g,b); } }* aveR1[i] =aveR/(20*20); aveG1[i] =aveG/(20*20); aveB1[i] =aveB/(20*20); Memo2->Lines->Add(aveR1); Memo2->Lines->Add(aveG1); Memo2->Lines->Add(aveB1); zeromeanR=r-aveR1[i]; zeromeanG=g-aveR1[i]; zeromeanB=b-aveR1[i]; } [/code]
------
新手報到
編輯記錄
913028 重新編輯於 2009-03-31 16:57:36, 註解 無‧
|
ikk
尊榮會員 發表:4 回覆:413 積分:768 註冊:2003-06-30 發送簡訊給我 |
|
s8131556
一般會員 發表:0 回覆:9 積分:16 註冊:2003-10-30 發送簡訊給我 |
|
913028
一般會員 發表:30 回覆:41 積分:19 註冊:2008-06-24 發送簡訊給我 |
|
s8131556
一般會員 發表:0 回覆:9 積分:16 註冊:2003-10-30 發送簡訊給我 |
除了負值,也有可能是超過255,印出來看看結果才知道
可以用下面的方法印: [code cpp] Graphics::TBitmap *Bmp = new Graphics::TBitmap(); Byte *ptr; Bmp->Assign(Image1->Picture->Bitmap); AnsiString result; for(int i=0;i { result=""; ptr=(Byte*)Bmp->ScanLine[i]; for(int j=0;j { int x; ptr[j*3] = x; //取得點 (i, j) 的像素值,因為是灰階,所以只需要取其中一個顏色 /************ 針對 x 進行你要的處理後 *************/ // 把值回存至圖片中 ptr[j*3] = x; ptr[j*3 1] = x; ptr[j*3 2] = x; result = result IntToHex(x, 2) " "; // 將值用16進制,兩位數的方式顯示出來 } Memo1->Lines->Add(result); } Image1->Picture->Assign(Bmp); delete Bmp; [/code] |
913028
一般會員 發表:30 回覆:41 積分:19 註冊:2008-06-24 發送簡訊給我 |
===================引 用 s8131556 文 章=================== 除了負值,也有可能是超過255,印出來看看結果才知道 可以用下面的方法印: [code cpp] Graphics::TBitmap *Bmp = new Graphics::TBitmap(); Byte *ptr; Bmp->Assign(Image1->Picture->Bitmap); AnsiString result; for(int i=0;iHeight;i ) { result=""; ptr=(Byte*)Bmp->ScanLine[i]; for(int j=0;jWidth; j ) { int x; ptr[j*3] = x; //取得點 (i, j) 的像素值,因為是灰階,所以只需要取其中一個顏色 /************ 針對 x 進行你要的處理後 *************/ // 把值回存至圖片中 ptr[j*3] = x; ptr[j*3 1] = x; ptr[j*3 2] = x; result = result IntToHex(x, 2) " "; // 將值用16進制,兩位數的方式顯示出來 } Memo1->Lines->Add(result); } Image1->Picture->Assign(Bmp); delete Bmp; [/code] ================================================================= s8131556大大你好: 我將你給的程式用在一個Buttong上,先處理完如圖檔有黑色區塊後在使用,但是,顯示的值卻都只有 "00"...."00",然後我再用另一個方式將你給的程式放進處理區塊程式裡,值顯示了"C0000"...."C0000" 不知哪個程序上出了問題? 感謝
------
新手報到
編輯記錄
913028 重新編輯於 2009-04-01 11:09:17, 註解 無‧
|
s8131556
一般會員 發表:0 回覆:9 積分:16 註冊:2003-10-30 發送簡訊給我 |
這邊我不懂為何你要對 高 進行 Y_loop
因為你的高只有一次而已不是嗎? [code cpp] for(int i=0; i 而且黃框框會重疊嗎? 如果不會重疊應該要寫成如下: [code cpp] int startX =20; //灰階的起點 int startY =20; int endX =200; //灰階的終點 int endY =40; int aveR=0; for(int i=20; i<=endX;i =20) // =20 的20是黃框每次右移的量 { aveR=0; for(int j=0; j<20;j ) //這邊的20也是寬度的量 { for(int k=startY; k<=endY; k ) { int r = GetRValue(Image1->Canvas->Pixels[k][i j]); aveR =r; } } aveR /=400; Memo1->Lines->Add(IntToStr(aveR)); //應該會有10個數字吧? } [/code] |
913028
一般會員 發表:30 回覆:41 積分:19 註冊:2008-06-24 發送簡訊給我 |
===================引 用 s8131556 文 章===================
這邊我不懂為何你要對 高 進行 Y_loop 因為你的高只有一次而已不是嗎? .................. 而且黃框框會重疊嗎? .................. ========================================================= s8131556大大你好: 1.我在此部分,我只取我要處理的圖像的一部份,所以,我的高不只進行一次。 2.黃框是不會重疊,只是會上下左右都會有,不過大大给我的範例,對我來說,讓我又多學到一招,非常感謝 。 也感謝ikk大大敎我這麼多 。
------
新手報到 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |