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

對於這個邊緣測試的程式我有點疑問....

答題得分者是:arisaka_matsuri
xdio2
一般會員


發表:60
回覆:29
積分:17
註冊:2004-07-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-18 12:27:03 IP:61.59.xxx.xxx 未訂閱
我是個初學者 想請問一下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;iHeight;i   )
 {
  ptr=(Byte*)Bmp->ScanLine[i];
  for (int j=0;jWidth; j   )
  {
   p1[j][i]=ptr[j*3];
  }
 }
 for (int i=0;iHeight;i   )
 {
  ptr=(Byte*)Bmp->ScanLine[i];
  for (int j=0;jWidth; j   )
   {
      ptr[j*3]=Gx(j,i) Gy(j,i);
    ptr[j*3 1]=Gx(j,i) Gy(j,i);
    ptr[j*3 2]=Gx(j,i) Gy(j,i);
   }
  }
  Image2->Picture->Assign(Bmp);
  delete Bmp;
}
arisaka_matsuri
高階會員


發表:25
回覆:205
積分:231
註冊:2003-10-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-18 16:30:25 IP:140.113.xxx.xxx 未訂閱
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類別之外就可以了。
系統時間:2024-05-21 1:58:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!