Re: [問題] 新手發問-計算像素點數
看板C_and_CPP (C/C++)作者VictorTom (鬼翼&娃娃魚)時間16年前 (2009/06/15 23:16)推噓4(4推 0噓 8→)留言12則, 4人參與討論串4/4 (看更多)
※ 引述《KSJ (阿真)》之銘言:
: 啊 很抱歉
: 我沒學過c++ 我是寫c的
: 而且我沒用過bcb 上網查查應該是影像處理類的東西
: 不過在觀念上可以給你一些協助
: 解決辨法 可能要另請高人了...
: ※ 引述《luandrew (阿咪)》之銘言:
: : 恕刪
: : void __fastcall TForm1::Button2Click(TObject *Sender)
: 看起來好像gui裡的button按下去之後要做的事
是的, 它的Window Form上至少有這一個Button....
當它被按下的時候, 就會走進這一個function~~
或者應該說會走進這一個method進來....
其中, Button是Form的member, 這個function是Form的method....
: : {
: : int x,y,nB=0,nW=1;
: 你要用的變數 有x y 給迴圈用
: 還有nB nW
: 從下面有nB++ nW++看起來 是 白跟黑的計數器了
: 可是我不明白 為什麼白的要從1開始 而黑的要從0開始
: 一開始的個數不都是0嗎??
感覺是寫錯了沒錯....
: : for(y=1;y<=Image1->Height;y++)
: : {
: : for(x=1;x<=Image1->Picture->Width;x++)
: : {
: 掃過每一個點
: 雖然 "->" 我看不種 不過看起來有點struct的味道
: 不過其中x有Picture y的沒有 不知道有沒有問題(因為我不會啊 囧)
: 但不影響對程式觀念的解讀
Image, Picture都是一個class, Width是Picture的member....
Picture又是Image的member, 而且Image1是一個pointer....
因為是pointer, 所以用Image1->Picture->.....
不然要用(*Image1).Picture....或許也可以吧....
印像中, Image的Width和Picture的Width會是一致的....
或者小弟我還沒有碰過會讓兩者不一樣的情形....
但是就coding的一致性來說, 要嘛都用Picture這層, 要嘛都別用會比較好....
: : TCColor c=Image1->Canvas->Pixels[x][y];
: 看起來是把在 x y 這座標的Pixels值 放入TCColor形態的變數c中
應該說, Pixels[][]本身就是一個TCColor的二維陣列....
所以取出一個element的時候自然也是放到一個TCColor型態的變數裡....
: : if((int)c.Green < 128)
: : {
: 綠色成份小於128的話 就做下面的事
: 你也可以看看 你要程式幫你做什麼
不太確定是不是一開始就是讀入G=B=R的灰階圖....
是的話, 那其實它只是取一個Green來當灰階值判斷....
做為二值化的依據; 的確這裡有註解會比較好@_@"
<餘恕刪>
: 這個問題問得很好 囧...
: 呃...至少必須要記錄x跟y的座標吧
: 上面的程式 看起來使用完變數就消失了
: 當然也是可以用完即丟
: 不過 感覺你再開一次圖檔
: 專心記錄xy座標再計算 比較不會分心
其實不用把x / y座標一個一個記錄下來也沒有關係....
反正最後會除以總點數取平均, 所以只要累加座標就行了....
不過, 相對的就可能會有加到int爆表的問題出現XD
: 也許會浪費許多資源
: 但先以能達成目標為主 之後再慢慢改得盡善盡美吧
: 最後 你給我的感覺
: 有點那種 臨陣磨槍的感覺
: 是有什麼東西要急著生出來嗎 還是你的學長姊要磨練你呢
: 有時間的話不妨練一些基本功
: 例如 if
: for
: do while
: switch case
: (對不起都是舉c的)
基本語法也沒有什麼是屬於C的還是屬於C++的....
這些語法C有的C++一樣都有, 也都是需要了解的基礎:)
: 都是你寫程式的利器
: 祝 程式撰寫成功...
: 有誤請大家告訴我 Q_Q 不然就誤人子弟了orz...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 58.41.17.189
※ 編輯: VictorTom 來自: 58.41.17.189 (06/15 23:31)
推
06/15 23:37, , 1F
06/15 23:37, 1F
扯了這麼多, 試著改一個比較完整的好了=.="
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int x,y,nB=0,nW=0;
/* 多宣告幾個變數用來算質心吧 */
for(y=1;y<=Image1->Picture->Height;y++)
{
for(x=1;x<=Image1->Picture->Width;x++)
{
TCColor c=Image1->Canvas->Pixels[x][y];
if((int)c.Green < 128)
{
Image1->Canvas->Pixels[x][y]=TCColor(0, 0, 0).Color;
nB++; // 這一行跟下一行是學姊教我的
LabeledEdit_Black->Text = IntToStr(nB);
/* 加入黑色pixel的座標累加程式碼 */
}
else
{
Image1->Canvas->Pixels[x][y]=TCColor(255, 255, 255).Color;
nW++; // 這一行跟下一行是我照學姊練的
/* 你必須自己在Form上拖一個LabeledEdit並改取變數名
為LabeledEdit_White才能用, 不然compile都不會過 */
LabeledEdit_White->Text = IntToStr(nW);
/* 加上白色pixel的座標累加程式碼 */
}
}
}
/* 在上你已經累加出來黑色與白色pixel各別的總數,
也成功的加入了座標累加的程式碼的話,
現在這裡各別除一除就可以算出各別質心的所在位置了;
只是要注意除以0的case, 另外自己放元件來顯示質心的結果. */
}
==
最後, 因為只是片段, 所以我也不敢確定有沒有錯漏的東西....
還有因為小弟想閃了所以直接貼答案, 未必對您是一種阻礙....
就算程式work了, 邏輯上您還是需要了解學姐或我們給您的程式在做什麼....
也可能需要了解一下BCB6給您的這些元件, TImage, Picture, 其他您用到的....
包含裡面的element/member像Pixels[][], Canvas, TCColor等等....
那就更不用提基本C/C++程式設計了, 因為顯示您的研究所之路離不開這些XD
以上, 像K大一樣祝您程式撰寫順利, 以及找指導教授順利:)
※ 編輯: VictorTom 來自: 58.41.17.189 (06/16 00:14)
※ 編輯: VictorTom 來自: 58.41.17.189 (06/16 00:19)
→
06/16 00:20, , 2F
06/16 00:20, 2F
推
06/16 00:56, , 3F
06/16 00:56, 3F
推
06/16 10:24, , 4F
06/16 10:24, 4F
→
06/16 10:24, , 5F
06/16 10:24, 5F
→
06/16 10:44, , 6F
06/16 10:44, 6F
推
06/16 23:26, , 7F
06/16 23:26, 7F
→
06/16 23:42, , 8F
06/16 23:42, 8F
→
06/16 23:43, , 9F
06/16 23:43, 9F
→
06/16 23:44, , 10F
06/16 23:44, 10F
→
06/16 23:44, , 11F
06/16 23:44, 11F
→
06/16 23:45, , 12F
06/16 23:45, 12F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章