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

一些問題請教。

尚未結案
kikikaka
一般會員


發表:32
回覆:28
積分:12
註冊:2003-09-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-20 19:20:39 IP:220.130.xxx.xxx 未訂閱
各位大哥:    小弟有兩個問題想請問一下: 1. 請問我d[y-1][x-1]*log(d[y-1][x-1])以這樣子的log寫法正確嘛? 因為執行時,一直有錯誤,又不知錯在哪裡。    2.因為我的寫法很笨,例如以3x3來說,中心點是d[y][x],那我就依序把   其他的都寫出來,如d[x-1][y-1].....可是當我想利用較大的遮罩做處理時,例如4x4、8x8,就會顯得很難去寫這個程式,我想請問有其他的程式寫法嘛,讓我不用依序把每個都寫出來?    小弟是新手,請多多見諒。     
Graphics::TBitmap *pBitmap = new Graphics::TBitmap();
  pBitmap->Assign(Image1->Picture);      BTime=timeGetTime();      pixel8bit = new byte*[pBitmap->Height];
  d = new unsigned char*[pBitmap->Height];
    for (int y = 0; y < pBitmap->Height; y  )
    {
      pixel8bit[y] = (Byte *)pBitmap->ScanLine[y];
      d[y] = new unsigned char[pBitmap->Width];
      for (int x = 0; x < pBitmap->Width; x  )
      {
        d[y][x]= pixel8bit[y][x];
      }
    }        for (int y = 1; y < pBitmap->Height-1; y  )
      for (int x = 1; x < pBitmap->Width-1; x  )
      {
       g  = d[y-1][x-1]*log(d[y-1][x-1]) d[y-1][x]*log(d[y-1][x]) d[y-1][x 1]*log(d[y-1][x 1])
                d[y][x-1]*log(d[y][x-1]) d[y][x]*log(d[y][x]) d[y][x 1]*log(d[y][x 1])
                d[y 1][x-1]*log(d[y 1][x-1]) d[y 1][x]*log(d[y 1][x]) d[y 1][x 1]*log(d[y 1][x 1]);
              {
              if (g > 10000)
              {
              pixel8bit[y-1][x-1]=0;
              pixel8bit[y-1][x]=0;
              pixel8bit[y-1][x 1]=0;
              pixel8bit[y][x-1]=0;
              pixel8bit[y][x]=0;
              pixel8bit[y][x 1]=0;
              pixel8bit[y 1][x-1]=0;
              pixel8bit[y 1][x]=0;
              pixel8bit[y 1][x 1]=0;
              }
              else
              {
              pixel8bit[y-1][x-1]=255;
              pixel8bit[y-1][x]=255;
              pixel8bit[y-1][x 1]=255;
              pixel8bit[y][x-1]=255;
              pixel8bit[y][x]=255;
              pixel8bit[y][x 1]=255;
              pixel8bit[y 1][x-1]=255;
              pixel8bit[y 1][x]=255;
              pixel8bit[y 1][x 1]=255;
              }
              }
        }
 
發表人 - kikikaka 於 2003/10/20 19:44:50 發表人 - kikikaka 於 2003/10/20 19:48:53 發表人 - kikikaka 於 2003/10/20 23:14:47
taishyang
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-20 19:32:53 IP:140.135.xxx.xxx 未訂閱
kikikaka您好: 請參考下面聯結做適當的修改 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=39009 謝謝您的配合,還有請問一下您的程式最主要是要做什麼壓? 注意,log的內容是不能為0的喔~~ 順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~ 發表人 -
kikikaka
一般會員


發表:32
回覆:28
積分:12
註冊:2003-09-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-20 23:19:26 IP:220.130.xxx.xxx 未訂閱
引言: 你好,我的程式,只是對影像進行一些PIXEL值的運算,如果運算出來的值, 超過我給的門檻值,就給予這個範圍的影像全部都是0或255的pixel值。 每次程式執行都會有錯誤,log:SING error。 請問是為什麼啊? 謝謝各位大哥。
發表人 - kikikaka 於 2003/10/20 23:22:20
arisaka_matsuri
高階會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-21 01:00:36 IP:218.166.xxx.xxx 未訂閱
我是路人~~看過source後,發現  
pBitmap->Assign(Image1->Picture);
 
這一行就怪怪的,不是應該用
pBitmap->Assign(Image1->Picture->Bitmap);
 
這樣才會複製Image1的Bitmap吧~~ 嗯~程式的動作應該是進行空間遮罩運算,剛好我也在寫這方面的咚咚,所以就攤給大家看看。傳入函數的是要想要進行處理的TBitmap物件的指標,還有遮罩陣列(一律一維)和遮罩陣列大小(元素數)
 
// 空間遮罩運算(8bpp) FUNCTION
void __fastcall TForm1::ImageSpatialFilter(Graphics::TBitmap *pSourceBitmap,
                                           double *MaskArray, int NumberOfElements)
{
  int row, col;      // 計算遮罩的尺寸
  int MaskSize      = (int)sqrt(NumberOfElements);
  int deltaMaskSize = (MaskSize - 1) / 2;      // 準備指向pSourceBitmap像素記憶體的指標
  Byte **ptr1   = new Byte *[pSourceBitmap->Height];
  for(row = 0; row < pSourceBitmap->Height; row  )
    ptr1[row]   = (Byte *)pSourceBitmap->ScanLine[row];
  
  // 建立DestBitmap物件
  Graphics::TBitmap *pDestBitmap = new Graphics::TBitmap();
  pDestBitmap->Assign(pSourceBitmap);      // 處理空間遮罩運算,將結果輸出到pDestBitmap
  Byte   *ptr2;
  double Sum;
  int    index;
  int    r, c;
  for(row = 0; row < pSourceBitmap->Height; row  )
  {
    ptr2 = (Byte *)pDestBitmap->ScanLine[row];
    for(col = 0; col < pSourceBitmap->Width; col  )
    {
      // 影像邊界處理
      if(   row < deltaMaskSize || row >= pSourceBitmap->Height - deltaMaskSize
         || col < deltaMaskSize || col >= pSourceBitmap->Width - deltaMaskSize)
        Sum = 0;
      else
      {
      // Convolution計算
      Sum   = 0;
      index = 0;
      for(r = -deltaMaskSize; r <= deltaMaskSize; r  )
      {
        for(c = -deltaMaskSize; c <= deltaMaskSize; c  )
        {
          Sum  = (double)ptr1[row   r][col   c] * MaskArray[index];
          index  ;
        }
      }
      // 檢查Sum是否超出灰階範圍
      if(Sum < 0.0)
        Sum = 0;
      if(Sum > 255.0)
        Sum = 255;
      } // end of if-else          ptr2[col] = (Byte)Sum;
    } // end of for(col)
  } // end of for(row)      // 拷貝pDestBitmap到pSourceBitmap當成輸出
  pSourceBitmap->Assign(pDestBitmap);      delete pDestBitmap;
而實際上要呼叫的參數如
// 空間遮罩運算:Smoothing Filter 3x3
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  // 定義Smoothing Filter的MaskArray
  double Scale       = 1.0 / 9.0;
  double MaskArray[] = { 1, 1, 1,
                         1, 1, 1,
                         1, 1, 1};
  int NumberOfElements = sizeof(MaskArray) / sizeof(MaskArray[0]);
  for(int i = 0; i < NumberOfElements; i  )
    MaskArray[i] = Scale * MaskArray[i];      // CALL: ImageSpatialFilter
  ImageSpatialFilter(pCurrBitmap, MaskArray, NumberOfElements);
}
因此,關於我上述的處理程式,可以看出用一維陣列的便利。還有,遮罩尺寸一定是奇數*奇數,而且傳入的Bitmap一定是8bpp,不然會ㄔㄨㄚˋ的。 一開始我的寫法也是像你那樣,後來想實現5*5遮罩時就很吃力,所以才改成這個寫法。 各位大人請多指教~~^^
JerryKuo
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-21 10:26:49 IP:61.230.xxx.xxx 未訂閱
引言: 你好,我的程式,只是對影像進行一些PIXEL值的運算,如果運算出來的值, 超過我給的門檻值,就給予這個範圍的影像全部都是0或255的pixel值。 每次程式執行都會有錯誤,log:SING error。 請問是為什麼啊? 謝謝各位大哥。
kikikaka你好: 就像taishyang版主說的,log(x),x不能為0。如果為0,就會出現log:SING error 可以說一下你的方程式數學模型嗎。讓大家也可以幫忙解決像素值為零時狀況。 還有另外附帶一提, log(x)這個函數指的是natural log,也就是數學式ln(),e為底。因為我剛剛差點 被他給騙了, 我以為log(),是2為底的,要注意一下。 一般常用log10(),10為底。但沒有log2()這個函數。
kikikaka
一般會員


發表:32
回覆:28
積分:12
註冊:2003-09-26

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-21 15:17:04 IP:220.130.xxx.xxx 未訂閱
抱歉,因為我不知道如何在此編輯方程式。 所以方程式打的很亂,請見諒。 我想寫的數學模型,就是下面的方程式。 Σ P(ij)logP(ij) (ij) (ij)是表示下標的部分。 P(ij)就是第(i,j)的像素值,我是想以此方程式計算3x3範圍內值。 還有請問各位高手,遮罩一定只能是奇數×奇數嘛? 不能用偶數×偶數嘛?還是說偶數×偶數要用別的寫法? 謝謝各位。
JerryKuo
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-10-22 09:34:26 IP:61.230.xxx.xxx 未訂閱
引言: 抱歉,因為我不知道如何在此編輯方程式。 所以方程式打的很亂,請見諒。 我想寫的數學模型,就是下面的方程式。 Σ P(ij)logP(ij) (ij) (ij)是表示下標的部分。 P(ij)就是第(i,j)的像素值,我是想以此方程式計算3x3範圍內值。 還有請問各位高手,遮罩一定只能是奇數×奇數嘛? 不能用偶數×偶數嘛?還是說偶數×偶數要用別的寫法? 謝謝各位。
kikikaka你好: 1.) 遮罩用奇數大小原理是基於中心點, 例如3x3中心就是[1,1],如果換成偶數 4x4 就沒有實質的中心點,虛擬中心點[1.5,1.5]不存在。在做銳化柔化等處理 ,就是對中心點做強化或削減的動作, 如果沒有中心點做了也是白做。此類的處 理就需要用到奇數遮罩。其他如量化(quantization)之類的,就不需要中心點 ,就可以用偶數遮罩,且為編碼需要,遮罩大小通常都是偶數。根據你的數學模型 比較屬於統計之類,單數或偶數遮罩應該都可以。 2.) 因為像素0為黑色,所以log(0) 很有可能會發生。小弟有個想法,為不影響統計的 精確度,像素範圍可以做一次shift,也就是0~255,全部加1變成1~256,log2()的結 果為0~8,在值域上會比用0~255好用很多。不過log2()這個函數,可能要另外新增 或是自己用泰勒展開式寫。 參考看看
kikikaka
一般會員


發表:32
回覆:28
積分:12
註冊:2003-09-26

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-10-22 19:54:38 IP:220.130.xxx.xxx 未訂閱
引言:
引言: kikikaka你好: 1.) 遮罩用奇數大小原理是基於中心點, 例如3x3中心就是[1,1],如果換成偶數 4x4 就沒有實質的中心點,虛擬中心點[1.5,1.5]不存在。在做銳化柔化等處理 ,就是對中心點做強化或削減的動作, 如果沒有中心點做了也是白做。此類的處 理就需要用到奇數遮罩。其他如量化(quantization)之類的,就不需要中心點 ,就可以用偶數遮罩,且為編碼需要,遮罩大小通常都是偶數。根據你的數學模型 比較屬於統計之類,單數或偶數遮罩應該都可以。 2.) 因為像素0為黑色,所以log(0) 很有可能會發生。小弟有個想法,為不影響統計的 精確度,像素範圍可以做一次shift,也就是0~255,全部加1變成1~256,log2()的結 果為0~8,在值域上會比用0~255好用很多。不過log2()這個函數,可能要另外新增 或是自己用泰勒展開式寫。 參考看看 < face="Verdana, Arial, Helvetica"> JerryKuo你好: 我把像素值都加1以後,就不會有錯誤出現了。 真是謝謝你。
Gill
一般會員


發表:0
回覆:1
積分:0
註冊:2003-04-07

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-10-27 16:09:21 IP:61.222.xxx.xxx 未訂閱
kikikaka你好,        關於以2為base的log函數你可以用以10為base的log函數,這樣就可以用現成的API function了 Log2(N) = Log10 (N) / Log10 (2)    
系統時間:2024-04-30 21:53:25
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!