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

從RGB矩陣值轉影像問題

尚未結案
fu3751
一般會員


發表:16
回覆:10
積分:5
註冊:2004-04-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-12 21:06:46 IP:203.70.xxx.xxx 未訂閱
讀取一180X240的點陣圖 將該圖RBG值分別置於三個矩陣 將RGB矩陣經過一連串矩陣運算後 得到r3,g3,b3三個矩陣並轉換成影像 最後與原影像做比較    在最後r3,g3,b3轉影像產生錯誤 請高手解惑    程式測試到矩陣轉影像處以前都沒問題    int i,j; Byte *ptr;    Graphics::TBitmap *Bmp1=new Graphics::TBitmap(); Bmp1->Assign(Image1->Picture->Bitmap); float r[180][240],g[180][240],b[180][240];   //取得RGB static double l[180][240],m[180][240],s[180][240];   //取得lms static double L[180][240],M[180][240],S[180][240];   //取得LMS static double A[180][240],B[180][240],C[180][240];   //取得lab    static double L2[180][240],M2[180][240],S2[180][240];   //回復取得LMS static double l2[180][240],m2[180][240],s2[180][240];   //回復取得lms static double r2[180][240],g2[180][240],b2[180][240];   //回復取得RGB Byte r3[180][240],g3[180][240],b3[180][240];            //轉換RGB為Byte型態    for(j=0;j< Bmp1->Height; j++)   {   for(i=0;i< Bmp1->Width; i++)     {       r[j][i]=GetRValue(Bmp1-> Canvas-> Pixels[j][i]);       g[j][i]=GetGValue(Bmp1-> Canvas-> Pixels[j][i]);       b[j][i]=GetBValue(Bmp1-> Canvas-> Pixels[j][i]);       if(r[j][i]==0 && g[j][i]==0 && b[j][i]==0)        {r[j][i]=0.003922;g[j][i]=0.003922;b[j][i]=0.003922;}          l[j][i]=(0.3811*r[j][i]/255) + (0.5783*g[j][i]/255) + (0.0402*b[j][i]/255);       m[j][i]=(0.1967*r[j][i]/255) + (0.7244*g[j][i]/255) + (0.0782*b[j][i]/255);       s[j][i]=(0.0241*r[j][i]/255) + (0.1288*g[j][i]/255) + (0.8444*b[j][i]/255);          L[j][i]=log10(l[j][i]);       M[j][i]=log10(m[j][i]);       S[j][i]=log10(s[j][i]);          A[j][i]=(1/sqrt(3)*L[j][i]) + (1/sqrt(3)*M[j][i]) + (1/sqrt(3)*S[j][i]);       B[j][i]=(1/sqrt(6)*L[j][i]) + (1/sqrt(6)*M[j][i]) + (-2/sqrt(6)*S[j][i]);       C[j][i]=(1/sqrt(2)*L[j][i]) + (-1/sqrt(2)*M[j][i]);          L2[j][i]=(sqrt(3)/3*A[j][i]) + (sqrt(6)/6*B[j][i]) + (sqrt(2)/2*C[j][i]);       M2[j][i]=(sqrt(3)/3*A[j][i]) + (sqrt(6)/6*B[j][i]) + (sqrt(2)/-2*C[j][i]);       S2[j][i]=(sqrt(3)/3*A[j][i]) + (sqrt(6)/-3*B[j][i]);          l2[j][i]=pow(10,L2[j][i]);       m2[j][i]=pow(10,M2[j][i]);       s2[j][i]=pow(10,S2[j][i]);          r2[j][i]=(4.4679*l2[j][i]*255) + ((-3.5873)*m2[j][i]*255) + (0.1193*s2[j][i]*255);       if(r2[j][i]>255)        r2[j][i]=255;       if(r2[j][i]<0) r2[j][i]=0; r3[j][i]=(Byte)r2[j][i]; g2[j][i]=((-1.2186)*l2[j][i]*255) + (2.3809*m2[j][i]*255) + ((-0.1624)*s2[j][i]*255); if(g2[j][i]>255) g2[j][i]=255; if(g2[j][i]<0) g2[j][i]=0; g3[j][i]=(Byte)g2[j][i]; b2[j][i]=(0.0497*l2[j][i]*255) + ((-0.2439)*m2[j][i]*255) + (1.2045*s2[j][i]*255); if(b2[j][i]>255) b2[j][i]=255; if(b2[j][i]<0) b2[j][i]=0; b3[j][i]=(Byte)b2[j][i]; } } for(j=0;jHeight;j++) //RGB矩陣轉影像 { ptr=(Byte *)Image2->Picture->Bitmap->ScanLine[j]; int index=0; for(i=0;iWidth;i++) { ptr[index]=b3[j][i]; ptr[index+1]=g3[j][i]; ptr[index+2]=r3[j][i]; index=index+3; } } } 發表人 - taishyang 於 2004/09/13 00:38:51
richtop
資深會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-12 22:46:39 IP:211.76.xxx.xxx 未訂閱
fu3751 您好:    檢視後發現兩個問題,您先參考一下: 1.Canvas-> Pixels[x][y]的使用順序是:先x(column,水平方向)後y(row,垂直方向),您似乎用反了。 2.寬高部分的索引都是從零開始,所以只能算到寬高減一處,如下:
for (j=0; j < Bmp1->Height-1; j  )
   { for(i=0; i < Bmp1->Width-1; i  )
RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
fu3751
一般會員


發表:16
回覆:10
積分:5
註冊:2004-04-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-13 07:20:36 IP:203.70.xxx.xxx 未訂閱
richtop您好    我把程式做如下修正還是出現相同錯誤訊息 不知是修正有錯 還是哪裡出了問題
 
for(j=0;jHeight-1;j  )
  {
  for(i=0;iWidth-1;i  )
    {
      r[j][i]=GetRValue(Bmp1->Canvas->Pixels[i][j]);
      g[j][i]=GetGValue(Bmp1->Canvas->Pixels[i][j]);
      b[j][i]=GetBValue(Bmp1->Canvas->Pixels[i][j]);
...
...
for(j=0;jHeight-1;j  )
  {
    ptr=(Byte *)Image2->Picture->Bitmap->ScanLine[j];
    int index=0;
      for(i=0;iWidth-1;i  )
        {
           ptr[index]=b3[j][i];
           ptr[index 1]=g3[j][i];
           ptr[index 2]=r3[j][i];
           index=index 3;
        }
  }
發表人 - fu3751 於 2004/09/13 10:37:41 發表人 - fu3751 於 2004/09/13 10:46:42
fu3751
一般會員


發表:16
回覆:10
積分:5
註冊:2004-04-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-13 10:56:17 IP:203.70.xxx.xxx 未訂閱
    我將程式修正後 還是出現相同錯誤訊息 不知哪裡出錯 我覺得是矩陣轉影像 請協助解決 謝謝    
 
for(j=0;jHeight-1;j  )
  {
  for(i=0;iWidth-1;i  )
    {
      r[j][i]=GetRValue(Bmp1->Canvas->Pixels[i][j]);
      g[j][i]=GetGValue(Bmp1->Canvas->Pixels[i][j]);
      b[j][i]=GetBValue(Bmp1->Canvas->Pixels[i][j]); 
...
...
...
for(j=0;jHeight-1;j  )  //矩陣轉影像
  {
    ptr=(Byte *)Image2->Picture->Bitmap->ScanLine[j];
    int index=0;
      for(i=0;iWidth-1;i  )
        {
           ptr[index]=b3[j][i];
           ptr[index 1]=g3[j][i];
           ptr[index 2]=r3[j][i];
           index=index 3;
        }
  }
}
TheMoon
中階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-13 16:38:12 IP:202.39.xxx.xxx 未訂閱
不曉得是不是因為你沒有設定Image2->Picture->Bitmap的相關屬性而造成錯誤, 我將程式修改如下可以正常work:
  ...
  ...
  ...
  Graphics::TBitmap *Bmp2=new Graphics::TBitmap();
  Bmp2->PixelFormat=Bmp1->PixelFormat;
  Bmp2->Height=Bmp1->Height;
  Bmp2->Width=Bmp1->Width;
  for(j=0;j<Bmp2->Height;j  )  //RGB矩陣轉影像
  {
     ptr=(Byte *)Bmp2->ScanLine[j];
     int index=0;
     for(i=0;iWidth;i  )
     {
        ptr[index]=b3[j][i];
        ptr[index 1]=g3[j][i];
        ptr[index 2]=r3[j][i];
        index=index 3;
     }
  }
  Image2->Picture->Assign(Bmp2);
  delete Bmp1;
  delete Bmp2;
richtop
資深會員


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-09-13 18:43:10 IP:211.76.xxx.xxx 未訂閱
fu3751 您好:    非常抱歉,因為一下寫Delphi,一下用BCB,所以講對但範例給錯了! 在>< face="Verdana, Arial, Helvetica">引言:
 
for(j=0;jHeight;j  )  //矩陣轉影像
  {
    ptr=(Byte *)Image2->Picture->Bitmap->ScanLine[j];//用Bmp1的高度去讀Image2中Bitmap的ScanLine[.],可能造成範圍不合。
    int index=0;
      for(i=0;iWidth;i  )
        {
           ptr[index]=b3[j][i];
           ptr[index 1]=g3[j][i];
           ptr[index 2]=r3[j][i];
           index=index 3;
        }
  }
}
RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
fu3751
一般會員


發表:16
回覆:10
積分:5
註冊:2004-04-05

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-09-14 17:49:21 IP:210.70.xxx.xxx 未訂閱
TheMoon,richtop您好 感謝您們的幫忙 圖可顯示出來 卻產生了誤差 不知何緣故 我有把source的RGB 與轉換後的RGB值挑出幾個來對照 最多會有1的誤差 因為從double的型態轉成Byte型態時4捨5入產生的誤差    顯示的結果如下所示
richtop
資深會員


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-09-14 18:44:41 IP:211.76.xxx.xxx 未訂閱
fu3751 您好:    由您的結果來看,兩圖的大小並不一樣,所以有必要對它們的PixelFormat作一檢視。因為您用的圖是Borland所附的256色圖檔,PixelFormat可能是pf8bit。 另外您做了很多的運算,在最後才show出結果,因此到底在哪一個環節出錯,恐怕不容易看出來。所以建議您可以將各階段的運算結果先秀出來,比方說,在取得各點顏色之後,可以先秀一下或故意轉成灰階之類的來驗證讀入的資料,等確認無誤之後,再進行下一步的轉換,這樣比較容易找出問題點來,以利修正。 供您參考!
TheMoon
中階會員


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-09-14 23:29:50 IP:61.230.xxx.xxx 未訂閱
建議你使用24bit bmp影像做測試, 因為我run出來的結果是沒問題地
fu3751
一般會員


發表:16
回覆:10
積分:5
註冊:2004-04-05

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-09-16 20:59:48 IP:210.70.xxx.xxx 未訂閱
再次感謝richtop,TheMoon二位幫忙 richtop給我觀念上啟發 但是TheMoon幫我解決問題 所以我把分數給了TheMoon 另外請教一下 為什麼讀取24bitsbmp圖檔轉後能成功 而讀取8bits圖檔轉換後圖形卻變了樣
TheMoon
中階會員


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-09-17 00:29:05 IP:61.230.xxx.xxx 未訂閱
引言: 再次感謝richtop,TheMoon二位幫忙 richtop給我觀念上啟發 但是TheMoon幫我解決問題 所以我把分數給了TheMoon 另外請教一下 為什麼讀取24bitsbmp圖檔轉後能成功 而讀取8bits圖檔轉換後圖形卻變了樣
請參考 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=55371
系統時間:2024-05-21 2:28:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!