對於這個邊緣測試的程式我有點疑問.... |
答題得分者是:arisaka_matsuri
|
xdio2
一般會員 發表:60 回覆:29 積分:17 註冊:2004-07-23 發送簡訊給我 |
我是個初學者
想請問一下taishyang版主他在精華區中的影像處理範例程式 關於他邊緣測試的部分
他應該是使用Prewitt的方法吧 (我是看遮罩的方式...)
最底下就是他那部份使用到的程式碼 (有疑問的地方我都用紅色字體表示)
請問一下大家
(1)
p1[j][i]=ptr[j*3];
這行是否表示版主他是用24bit的圖來做測試呢?
因為他只取三的倍數的值,是否因為這個邊緣測試的圖
已經經過灰階,而灰階表示24bit RGB值皆相等
所以他只取其一? 若是以上我說的正確的話,要是我今天拿了一個8bit的灰階bmp圖來測試
是否會照成錯誤?
要是我又分別拿24bit 彩色bmp跟8bit 彩色圖片
可是我自己測試時,版主這個程式都能跑出正確的邊緣阿
代表我上面說的觀念是錯誤的囉....
那為何版主要每隔三個值才取呢?
這樣的話不就會影響原本圖形像素排列了嗎? (2)
int __fastcall TForm1::Gx(int i,int j)
這個地方應該是版主他自己需要用到的函式吧
為何他不是寫
int Gx(int i,int j) 這樣呢?
__fastcall TForm1:: 這個加上的部分
應該是宣告G函式是在 __fastcall TForm1 類別中的意思吧?
可是寫成這樣int Gx(int i,int j)也是可以執行阿
為何我去掉__fastcall TForm1:: 這部分時卻不能編譯呢? 以上兩個問題,小弟程度不好,問的可能比較膚淺
請大家不吝賜教,感謝~~
int p1[640][480]; int __fastcall TForm1::Gx(int i,int j) { int GX; int p[10]; p[1]=p1[i-1][j-1]; p[2]=p1[i][j-1]; p[3]=p1[i 1][j-1]; p[4]=p1[i-1][j]; p[5]=p1[i][j]; p[6]=p1[i 1][j]; p[7]=p1[i-1][j 1]; p[8]=p1[i][j 1]; p[9]=p1[i 1][j 1]; GX=((p[7] p[8] p[9])-(p[1] p[2] p[3]))/4; if (GX<0) GX=(-1)*GX; return (GX); } //--------------------------------------------------------------------------- int __fastcall TForm1::Gy(int i,int j) { int GY; int p[10]; p[1]=p1[i-1][j-1]; p[2]=p1[i][j-1]; p[3]=p1[i 1][j-1]; p[4]=p1[i-1][j]; p[5]=p1[i][j]; p[6]=p1[i 1][j]; p[7]=p1[i-1][j 1]; p[8]=p1[i][j 1]; p[9]=p1[i 1][j 1]; GY=((p[1] p[4] p[7])-(p[3] p[6] p[9]))/4; if (GY<0) GY=(-1)*GY; return (GY); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button6Click(TObject *Sender) { if (Image1->Picture->Bitmap->Empty==true) ShowMessage("請載入圖檔!!"); Graphics::TBitmap *Bmp = new Graphics::TBitmap(); Byte *ptr; Bmp->Assign(Image1->Picture->Bitmap ); for (int i=0;i |
arisaka_matsuri
高階會員 發表:25 回覆:205 積分:231 註冊:2003-10-19 發送簡訊給我 |
dear xdio2:
(1) 沒錯,灰階以24bit RGB表示,其值皆相等才能以 p1[j][i]=ptr[j*3] 來做計算。
我用「影像處理VI」來試驗,載入一張8 bit灰階圖連動都不能動。8 bit彩色圖好像可以,但是做灰階時就產生奇怪的結果了~以壓縮檔內附的color.map為例,就是8 bit的彩色圖,做灰階時的結果不是灰階的顯示,每個像素還像被抖到的重疊著,這就是你所謂「影響原本圖形像素排列」。至於邊緣化,我個人認為garbage in garbage out。所以你的觀念是正確的沒錯
當然我沒有要批評 >< face="Verdana, Arial, Helvetica">引言:
為何我去掉__fastcall TForm1:: 這部分時卻不能編譯呢?
先參考一下.h的內容,把int Gx(int i,int j)的宣告擺在TForm1類別之外就可以了。
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |