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

取得相鄰灰階變化最大點

尚未結案
williams8807
一般會員


發表:40
回覆:37
積分:15
註冊:2003-11-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-06 16:33:35 IP:163.28.xxx.xxx 未訂閱
我寫了一個利用ScanLine掃一個row的程式 希望從300*300 Image的中心點(150,150)開始 紀錄(150,150)到(300,150)的灰階 並且找出相鄰灰階變化最大的點 但我不知道程式那邊出了問題 麻煩各位大大幫忙解惑  謝謝    
Graphics::TBitmap *Bmp = new Graphics::TBitmap();
 Byte *point;
 Bmp->Assign(Image2->Picture->Bitmap );
 Bmp->Height=300;
 Bmp->Width=300;     point=(Byte*)Bmp->ScanLine[150];
 for (j=0;jWidth/2; j  )
    {
      D[j]=abs((int)point[j 1]-(int)point[j]);
    }     for (j=0;j<75;j  )
   {
     if (D[j 1]>D[j]&&D[j 1]>=0)
       {
        max1=j 1;
       }
     else if (D[j]>D[j 1]&&D[j]>=0)
       {
        max1=j;
       }
     else
       {
        max1=j;
       }
   }     Bmp->Canvas->Pen->Color=clRed;
 Bmp->Canvas->Pen->Width=1;
 Bmp->Canvas->MoveTo(150,150);
 Bmp->Canvas->LineTo(150 max1,150);
 Image2->Picture->Assign(Bmp);
 delete Bmp;    
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-06 17:24:31 IP:211.76.xxx.xxx 未訂閱
williams8807 您好:    point=(Byte*)Bmp->ScanLine[150];  for (j=0;jWidth/2; j ) { D[j]=abs((int)point[j 1]-(int)point[j]); } 一個可能的問題是: ScanLine每一Pixel佔3-bytes(以pf24bit為例),所以顯然您的取值範圍錯了。 即使是灰階圖形,每一Pixel仍佔3-bytes,只是RGB三個值均相等。 建議將程式修該如下: Bmp->PixelFormat = pf24bit; ... ... D[j]=abs((int)point[3*(150 j 1)]-(int)point[150 3*j]); RichTop 敬上 發表人 -
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-07 01:58:31 IP:140.135.xxx.xxx 未訂閱
您好: 如richtop前輩所說,但倘若您的圖是8bits灰階影像 則改成
Bmp->PixelFormat = pf8bit;
即可 順心
williams8807
一般會員


發表:40
回覆:37
積分:15
註冊:2003-11-22

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-07-07 14:48:38 IP:163.28.xxx.xxx 未訂閱
我已經修正過了 但還是不行    下面是我測試出來的圖
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-07-07 16:58:15 IP:61.230.xxx.xxx 未訂閱
引言: 我寫了一個利用ScanLine掃一個row的程式 希望從300*300 Image的中心點(150,150)開始 紀錄(150,150)到(300,150)的灰階 並且找出相鄰灰階變化最大的點 但我不知道程式那邊出了問題 麻煩各位大大幫忙解惑 謝謝
williams8807你好: 不妨試試先將影像的灰階用二維陣列存起來,不要用bitmap的scanline 雖然多了一道步驟,但往後要做任何處理都很方便。不會有pixel format的問題
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-07-07 17:47:42 IP:211.76.xxx.xxx 未訂閱
williams8807 您好:
 
//=====***** your codes
for (j=0;j<75;j  )
   {
     if (D[j 1]>D[j]&&D[j 1]>=0)
       {
        max1=j 1;
       }
     else if (D[j]>D[j 1]&&D[j]>=0)
       {
        max1=j;
       }
     else
       {
        max1=j;  // 當前後值一樣時,會繼續將此點往後移!此段可略去。
       }
   }
 
//=====#####
所以您的程式才會連到後面去。 其實您也可以直接求出D[.]中最大值的所在,再去作後續的處理。 RichTop 敬上 發表人 - taishyang 於 2004/07/07 18:22:52
williams8807
一般會員


發表:40
回覆:37
積分:15
註冊:2003-11-22

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-07-08 17:50:52 IP:163.28.xxx.xxx 未訂閱
謝謝richtop和各位高手的解惑 上面那張影像已經ok 但為什麼我換了一張屬性一樣的影像[300*300  24bit]就不行了?    下面這張影像原本是640*480,24bit  我利用CopyRect截取成300*300,24bit 不論截取哪塊區域,紅線的長度都一樣 我真想不透為什麼     發表人 - williams8807 於 2004/07/08 17:52:58
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-07-08 20:39:29 IP:211.76.xxx.xxx 未訂閱
試著將D[.]陣列列出(例如:丟入ListBox中)觀察其結果看看。 Good Luck!! RichTop 敬上
williams8807
一般會員


發表:40
回覆:37
積分:15
註冊:2003-11-22

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-07-13 10:42:23 IP:163.28.xxx.xxx 未訂閱
抱歉!最近幾天很忙沒碰電腦 我用Richedit 觀察過灰階變化 發現變化最大點和畫出來的不一樣 PS:不同的選取區域畫出來的線段都一樣長 why?謝謝!
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-07-13 11:34:53 IP:211.76.xxx.xxx 未訂閱
 
//=====***** your codes
for (j=0;j<75;j  )
   {
     if (D[j 1]>D[j]&&D[j 1]>=0)
       {
        max1=j 1;
       }
     else if (D[j]>D[j 1]&&D[j]>=0)
       {
        max1=j;
       }
     else
       {
        max1=j;  // 當前後值一樣時,會繼續將此點往後移!此段可略去。
       }
   }
 
//=====#####
上述的判斷部分,我覺得會有拉扯的現象發生,似乎不能找到真正的最大值。 之所以先前的圖形成功,我猜是因為它只有兩種顏色且分佈規則。 如果是要找到最大值的位置,我建議改寫上述程式碼(以比較符合我用的思考方式):
 
//=====***** my suggestion codes
int value=D[0];
max1 = 0;    for (j=1;j<75;j  )
   {
     if ( D[j]>value )
       {
         max1 = j;
         value = D[j];
       }
    }    
RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
系統時間:2024-05-20 20:38:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!