Re: [問題] 新手發問-計算像素點數

看板C_and_CPP (C/C++)作者 (鬼翼&娃娃魚)時間16年前 (2009/06/15 23:16), 編輯推噓4(408)
留言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
感謝V大 受教了<(_ _)> 真是好人一個!!!(回擊)
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
慘了, 中文越來越差了, 個別都寫成了各別(羞奔Q_Q~)
06/16 00:20, 2F

06/16 00:56, , 3F
V大是壞人...(筆記ing) 揪甘心推一個~Q_Q
06/16 00:56, 3F

06/16 10:24, , 4F
話說,我一直以為要求的質心是每個封閉區塊的質心。想說現
06/16 10:24, 4F

06/16 10:24, , 5F
在的課程這麼進步了 Orz
06/16 10:24, 5F

06/16 10:44, , 6F
因為小弟我懶得解釋怎麼找連續的pixels區塊呀XD
06/16 10:44, 6F

06/16 23:26, , 7F
V大.我做成功了.謝謝你的指導與教導..T__T
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
一整區pixels, 也就是找connected components, 像上面s
06/16 23:44, 10F

06/16 23:44, , 11F
大說的, 看有沒有辦法找出所有封閉區塊; 至於每個封閉區
06/16 23:44, 11F

06/16 23:45, , 12F
塊的質心就還好了, 會分區了, 想必個別小質心也ok的^^
06/16 23:45, 12F
文章代碼(AID): #1ADcMw18 (C_and_CPP)
文章代碼(AID): #1ADcMw18 (C_and_CPP)