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

框選的區塊取灰階值

答題得分者是:ikk
913028
一般會員


發表:30
回覆:41
積分:19
註冊:2008-06-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-03-23 10:53:10 IP:163.23.xxx.xxx 訂閱

各位大大好:
現在可以將灰階地方取區塊,但是,我要在各區塊中取每個區塊的灰階值,而每個區塊的個灰階值存放置Memo1->Lines->Add(ObjCount);
可是,這個指令好像是在計算次數的,不知還有什麼方式可以使用?
最後,在請問每個區塊的範圍要如何取呢? 想了幾天還是想不出來!!

感謝

[code cpp]
int X=200;
int Y=40;
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;
for(int i=0; ifor(int j=0; j{
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);
}

[/code]
------
新手報到
編輯記錄
913028 重新編輯於 2009-03-23 10:54:27, 註解 無‧
913028 重新編輯於 2009-03-24 22:43:16, 註解 無‧
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-03-23 12:25:50 IP:163.28.xxx.xxx 訂閱
要取出圖片中的值當然是要取出裡面的點,
使用CopyRect.

[code cpp]
TRect TargetRect;
TRect SourceRect;
TCanvas * pSourceCanvas;
pCanvas = Image1->Canvas;

SourceRect.Left = 0;
SourceRect.Top = 0;
SourceRect.Right = 20;
SourceRect.Bottom = 20;

TargetRect.Left = 0;
TargetRect.Top = 0;
TargetRect.Right = 20;
TargetRect.Bottom = 20;

TargetImage->Canvas->CopyRect(TargetRect, pCanvas, SourceRect);

BYTE r;
BYTE g;
BYTE b;
char Msg[128];
for(int x=0;x<20;x )
for(int y=0;y<20;y )
{
r = GetRValue(TargetImage->Canvas->Pixels[x][y]);
g = GetGValue(TargetImage->Canvas->Pixels[x][y]);
b = GetBValue(TargetImage->Canvas->Pixels[x][y]);
sprintf(Msg,"R(%d) G(%d) B(%d)", r, g, b);
Memo1->Lines->Add(Msg);
}

[/code]
------
FPGA驗證, FPGA開發平台, http://smims.com
913028
一般會員


發表:30
回覆:41
積分:19
註冊:2008-06-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-03-23 13:41:49 IP:163.23.xxx.xxx 訂閱
請問ikk大大:
為何我執行時出現 Undefined symbol 'pCanvas' 、Undefined symbol 'TargetImage'、Call to undefined function 'sprintf'這三個問題。
我是把它放置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);底下執行時出現的。
感謝
===================引 用 ikk 文 章===================
要取出圖片中的值當然是要取出裡面的點,
使用CopyRect.
[code cpp]
TRect TargetRect;
TRect SourceRect;
TCanvas * pSourceCanvas;
pCanvas = Image1->Canvas;

SourceRect.Left = 0;
SourceRect.Top = 0;
SourceRect.Right = 20;
SourceRect.Bottom = 20;
TargetRect.Left = 0;
TargetRect.Top = 0;
TargetRect.Right = 20;
TargetRect.Bottom = 20;
TargetImage->Canvas->CopyRect(TargetRect, pCanvas, SourceRect);
BYTE r;
BYTE g;
BYTE b;
char Msg[128];
for(int x=0;x<20;x )
for(int y=0;y<20;y )
{
r = GetRValue(TargetImage->Canvas->Pixels[x][y]);
g = GetGValue(TargetImage->Canvas->Pixels[x][y]);
b = GetBValue(TargetImage->Canvas->Pixels[x][y]);
sprintf(Msg,"R(%d) G(%d) B(%d)", r, g, b);
Memo1->Lines->Add(Msg);
}
[/code]
------
新手報到
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-03-23 13:54:28 IP:163.28.xxx.xxx 訂閱

TargetImage 是 TImage
我只是給你個範例, 不是可以直接放到你的code的...

[code cpp]
TCanvas * pSourceCanvas;
pSourceCanvas = Image1->Canvas;
TargetImage->Canvas->CopyRect(TargetRect, pSourceCanvas, SourceRect);
[/code]
------
FPGA驗證, FPGA開發平台, http://smims.com
913028
一般會員


發表:30
回覆:41
積分:19
註冊:2008-06-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-03-23 14:10:34 IP:163.23.xxx.xxx 訂閱
ikk大大你好:
為何sprintf(Msg,"R(%d) G(%d) B(%d)", r, g, b);這地方會出現
[C Error] YIQ.cpp(2562): E2268 Call to undefined function 'sprintf'

感謝
------
新手報到
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-03-23 14:46:23 IP:163.28.xxx.xxx 訂閱

[code cpp]

#include

[/code]
------
FPGA驗證, FPGA開發平台, http://smims.com
913028
一般會員


發表:30
回覆:41
積分:19
註冊:2008-06-24

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-03-24 00:15:11 IP:125.224.xxx.xxx 訂閱
ikk大大你好:
現在程式可以執行,Image2->Canvas->CopyRect(TargetRect, pSourceCanvas, SourceRect);以上這些程式是複製的指令,
但是,以下的程式執行,為什RGB的值都是0,我給的是灰階圖。
------
新手報到
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-03-24 08:34:28 IP:163.28.xxx.xxx 訂閱
灰階圖格式??
------
FPGA驗證, FPGA開發平台, http://smims.com
913028
一般會員


發表:30
回覆:41
積分:19
註冊:2008-06-24

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-03-24 10:50:11 IP:163.23.xxx.xxx 訂閱
ikk大大你好:
RGB的值可以顯現了,原因在於我給的範圍都是黑色區塊,但是我沒有用到Image2->Canvas->CopyRect(TargetRect, pSourceCanvas, SourceRect);以上這些程式也是可以顯現,但是對每個區塊各取其灰階值還是用不出來
------
新手報到
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-03-24 10:57:24 IP:163.28.xxx.xxx 訂閱

取出pixel值, 不是你要的??

[code cpp]
r = GetRValue(TargetImage->Canvas->Pixels[x][y]);
g = GetGValue(TargetImage->Canvas->Pixels[x][y]);

b = GetBValue(TargetImage->Canvas->Pixels[x][y]);

[/code]
------
FPGA驗證, FPGA開發平台, http://smims.com
913028
一般會員


發表:30
回覆:41
積分:19
註冊:2008-06-24

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-03-24 11:09:13 IP:163.23.xxx.xxx 訂閱
ikk大大你好:
pixel值是我要的,但是我要把圖上灰階部分取各20*20的區塊,並且分別對這每個區塊取pixel值,分段顯現出各區塊的pixel值在Memo,除了一塊一塊去取,還有和方式呢?
===================引 用 ikk 文 章===================

取出pixel值, 不是你要的??

[code cpp]
r = GetRValue(TargetImage->Canvas->Pixels[x][y]);
g = GetGValue(TargetImage->Canvas->Pixels[x][y]);

b = GetBValue(TargetImage->Canvas->Pixels[x][y]);

[/code]
------
新手報到
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#12 引用回覆 回覆 發表時間:2009-03-24 11:13:35 IP:163.28.xxx.xxx 訂閱
取各20*20的區塊
不就是一塊一塊取??
我想可能你沒有表達出你想要的..
我從你文字中表達的看來就是一塊一塊取.
------
FPGA驗證, FPGA開發平台, http://smims.com
913028
一般會員


發表:30
回覆:41
積分:19
註冊:2008-06-24

發送簡訊給我
#13 引用回覆 回覆 發表時間:2009-03-24 11:44:17 IP:163.23.xxx.xxx 訂閱
ikk大大你好:
我想要的是這20*20是自動幫我框選(這我問過了),然後將這些每個所框選出來的區塊,內的灰階值一次顯示在Memo上,但是每個區塊所取的灰階值要分段。


------
新手報到
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#14 引用回覆 回覆 發表時間:2009-03-24 11:57:39 IP:163.28.xxx.xxx 訂閱
把抓出RGB的code 放到你的for迴圈, 就可以辦到...
------
FPGA驗證, FPGA開發平台, http://smims.com
913028
一般會員


發表:30
回覆:41
積分:19
註冊:2008-06-24

發送簡訊給我
#15 引用回覆 回覆 發表時間:2009-03-24 13:56:27 IP:163.23.xxx.xxx 訂閱

===================引 用 ikk 文 章===================
把抓出RGB的code 放到你的for迴圈, 就可以辦到...
================================================
ikk大大你好:
我把程式改成這樣,先測試一個區塊的灰階值,但是,灰階值全部顯示為255,不知又是那裡不對了?
麻煩大大
[code cpp]
int X=20;
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 x,y;

for(int i=0; ifor(int j=0; j{
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[x][y]);
g = GetGValue(Image1->Canvas->Pixels[x][y]);
b = GetBValue(Image1->Canvas->Pixels[x][y]);
sprintf(Msg,"R(%d) G(%d) B(%d)", r, g, b);
Memo1->Lines->Add(Msg);
}
[/code]
------
新手報到
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#16 引用回覆 回覆 發表時間:2009-03-24 14:05:51 IP:163.28.xxx.xxx 訂閱
Image1 放的是你的圖嗎?

Image1->Canvas->Rectangle() 只是用來畫框, 跟取值沒關係...
------
FPGA驗證, FPGA開發平台, http://smims.com
913028
一般會員


發表:30
回覆:41
積分:19
註冊:2008-06-24

發送簡訊給我
#17 引用回覆 回覆 發表時間:2009-03-24 14:33:38 IP:163.23.xxx.xxx 訂閱

===================引 用 ikk 文 章===================
Image1 放的是你的圖嗎?

Image1->Canvas->Rectangle() 只是用來畫框, 跟取值沒關係...
================================================
ikk大大你好:
Image1 放的是我的圖檔。

請問是以下的程式碼都可以不用嗎?
難道只能先用for迴圈範圍取一個區塊20*20裡面的灰階值做完,而另一個區塊需在另外寫一個for迴圈的範圍在取呢
[code cpp]
int X=20;
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;
for(int i=0; ifor(int j=0; j{
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);

}
[/code]

------
新手報到
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#18 引用回覆 回覆 發表時間:2009-03-24 14:40:56 IP:163.28.xxx.xxx 訂閱
這裡的X_loop 與 Y_loop就是要取出多少個20*20的區域呀...

共取出
X_loop * Y_loop 個
------
FPGA驗證, FPGA開發平台, http://smims.com
913028
一般會員


發表:30
回覆:41
積分:19
註冊:2008-06-24

發送簡訊給我
#19 引用回覆 回覆 發表時間:2009-03-24 15:47:05 IP:163.23.xxx.xxx 訂閱

===================引 用 ikk 文 章===================
這裡的X_loop 與 Y_loop就是要取出多少個20*20的區域呀...

共取出
X_loop * Y_loop 個
================================================
ikk大大你好:
以下為程式碼,這個程式碼我是用成取一個20*20的區域,可以取到我要的灰階區,但是我要在此區域得知其20*20的總灰階值,就是不行,出現 R(0) G(0) B(0) 就只有這一列。
麻煩大大


[code cpp]
int X=20;
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 x,y;

for(int i=0; ifor(int j=0; j{
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[x][y]);
g = GetGValue(Image1->Canvas->Pixels[x][y]);
b = GetBValue(Image1->Canvas->Pixels[x][y]);
sprintf(Msg,"R(%d) G(%d) B(%d)", r, g, b);
Memo1->Lines->Add(Msg);
}

[/code]
------
新手報到
編輯記錄
913028 重新編輯於 2009-03-24 15:48:35, 註解 無‧
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#20 引用回覆 回覆 發表時間:2009-03-24 16:01:12 IP:163.28.xxx.xxx 訂閱
再寫迴圈啊

[code cpp]
for(int ix=0;ix for(int iy=0;iy {
r = GetRValue(Image1->Canvas->Pixels[ix][iy]);
g = GetGValue(Image1->Canvas->Pixels[ix][iy]);
b = GetBValue(Image1->Canvas->Pixels[ix][iy]);
}
[/code]
------
FPGA驗證, FPGA開發平台, http://smims.com
913028
一般會員


發表:30
回覆:41
積分:19
註冊:2008-06-24

發送簡訊給我
#21 引用回覆 回覆 發表時間:2009-03-24 16:47:21 IP:163.23.xxx.xxx 訂閱
感謝 ikk大大 
終於可以了
------
新手報到
系統時間:2024-04-19 8:44:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!