線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:667
推到 Plurk!
推到 Facebook!

請教影像處理問題

尚未結案
pork
一般會員


發表:15
回覆:13
積分:5
註冊:2003-10-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-14 20:29:49 IP:220.141.xxx.xxx 未訂閱
大家好 我寫了一段Laplacian的程式 可是執行時會出現如下現象 第一次執行和第二次執行的圖不一樣 (只是同一個按鍵按二次) 還請高手指導一下 我是新手實在看不出事那兒出問題了 謝謝
    void __fastcall TForm1::Laplacian1Click(TObject *Sender)
{
        Graphics::TBitmap *Bmp1=new Graphics::TBitmap();
        Graphics::TBitmap *Bmp2=new Graphics::TBitmap();
        Bmp1->Assign(Image1->Picture->Bitmap);
        Bmp2->Assign(Image1->Picture->Bitmap);            for(int i=0;iWidth;i  )
        for(int j=0;jHeight;j  )
        {
                 Pixel_value[i][j]=GetRValue(Bmp1->Canvas->Pixels[i][j]);
                 Bmp2->Canvas->Pixels[i][j]=LaplacianFunction(i,j)*0x010101;
        }              Image2->Picture->Bitmap->Assign(Bmp2);
          delete Bmp1,Bmp2;    }
//---------------------------------------------------------------------------
int __fastcall TForm1::LaplacianFunction(int i ,int j)
{
        int p[5];
        int Laplacian_value;
        p[0]=Pixel_value[i][j-1];
        p[1]=Pixel_value[i-1][j];
        p[2]=Pixel_value[i][j];
        p[3]=Pixel_value[i 1][j];
        p[4]=Pixel_value[i][j 1];            Laplacian_value=(4*p[2]-(p[0] p[1] p[3] p[4]));
        return (Laplacian_value);
發表人 - taishyang 於 2004/09/14 21:12:48
foreman
高階會員


發表:3
回覆:124
積分:190
註冊:2004-09-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-14 20:48:45 IP:218.172.xxx.xxx 未訂閱
pork: 在這int __fastcall TForm1::LaplacianFunction(int i ,int j)函數內, p[3] p[4]是未定數, 看當時記憶体之值.所以 for(int i=0;iWidth;i++) for(int j=0;jHeight;j++) { Pixel_value[i][j]=GetRValue(Bmp1->Canvas->Pixels[i][j]); Bmp2->Canvas->Pixels[i][j]=LaplacianFunction(i,j)*0x010101; } 應改成 for(int i=0;iWidth;i++) for(int j=0;jHeight;j++) { Pixel_value[i][j]=GetRValue(Bmp1->Canvas->Pixels[i][j]); } for(int i=0;iWidth;i++) for(int j=0;jHeight;j++) { Bmp2->Canvas->Pixels[i][j]=LaplacianFunction(i,j)*0x010101; }    < >< >
TheMoon
中階會員


發表:17
回覆:95
積分:67
註冊:2002-06-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-15 00:09:40 IP:61.230.xxx.xxx 未訂閱
要注意下面這段程式, 在計算時會超過陣列邊界的問題 < class="code"> int __fastcall TForm1::LaplacianFunction(int i ,int j) { int p[5]; int Laplacian_value; p[0]=Pixel_value[i][j-1]; p[1]=Pixel_value[i-1][j]; p[2]=Pixel_value[i][j]; p[3]=Pixel_value[i 1][j]; p[4]=Pixel_value[i][j 1]; Laplacian_value=(4*p[2]-(p[0] p[1] p[3] p[4])); return (Laplacian_value); } 發表人 - TheMoon 於 2004/09/15 00:11:22
pork
一般會員


發表:15
回覆:13
積分:5
註冊:2003-10-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-15 05:34:59 IP:220.141.xxx.xxx 未訂閱
感謝foreman及TheMoon二位的解答 我把程式按照foreman兄的方法修改後 已經改進了真是感謝二位的熱心協助 可否再請教TheMoon兄 什麼情況稱為超過陣列邊界 是否就是如同foreman兄說的p[3] p[4]是未定數 所以執行出來情況會不同 感謝 pork 上
TheMoon
中階會員


發表:17
回覆:95
積分:67
註冊:2002-06-05

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-15 11:41:44 IP:202.39.xxx.xxx 未訂閱
引言: 感謝foreman及TheMoon二位的解答 我把程式按照foreman兄的方法修改後 已經改進了真是感謝二位的熱心協助 可否再請教TheMoon兄 什麼情況稱為超過陣列邊界 是否就是如同foreman兄說的p[3] p[4]是未定數 所以執行出來情況會不同 感謝 pork 上
pork兄您好,
程式主要的問題如foreman大大所言,
是出在 p[3] p[4],
我提到的問題是要注意以下情形:
p[0]=Pixel_value[i][j-1]; //j=0時,j-1=-1
p[1]=Pixel_value[i-1][j]; //i=0時,i-1=-1
p[3]=Pixel_value[i 1][j]; //i=Bmp1->Width-1時,i 1=Bmp1->Width
p[4]=Pixel_value[i][j 1]; //j=Bmp1->Height-1時,j 1=Bmp1->Height    參考看看
     
        
pork
一般會員


發表:15
回覆:13
積分:5
註冊:2003-10-25

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-09-15 20:14:13 IP:220.141.xxx.xxx 未訂閱
感謝TheMoon兄的指導 就您所言是不是把程式改為 for(int i=1;iWidth-2;i ) for(int j=1;jHeight-2;j ) { ............ } ........... p[0]=Pixel_value[i][j-1]; p[1]=Pixel_value[i-1][j]; p[2]=Pixel_value[i][j]; p[3]=Pixel_value[i 1][j]; p[4]=Pixel_value[i][j 1]; 就可避免了超出陣列的問題了 再請教 超出陣列邊界對程式結果的影響是什麼呢 謝謝 pork 上
TheMoon
中階會員


發表:17
回覆:95
積分:67
註冊:2002-06-05

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-09-16 15:10:24 IP:202.39.xxx.xxx 未訂閱
引言:
感謝TheMoon兄的指導
就您所言是不是把程式改為
for(int i=1;iWidth-2;i  )
for(int j=1;jHeight-2;j  )
{
............    }
...........
p[0]=Pixel_value[i][j-1];
p[1]=Pixel_value[i-1][j];
p[2]=Pixel_value[i][j];
p[3]=Pixel_value[i 1][j];
p[4]=Pixel_value[i][j 1];
就可避免了超出陣列的問題了

A:Yes    再請教
超出陣列邊界對程式結果的影響是什麼呢    A:在程式執行時會存取到非陣列範圍內的資料,
   有可能造成計算結果錯誤,
   或者造成index out of range的錯誤。    舉一個簡單的例子試試看吧!
int i;
int a[9]={1,2,3,4,5,6,7,8,9};    Memo1->Clear();
for(i=-10;i<11;i  )
  Memo1->Lines->Add("a["   IntToStr(i)   "]:"   IntToStr(a[i]));    
系統時間:2024-05-21 2:27:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!