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

如何將Cb、Cr影像運算

缺席
keikojason
初階會員


發表:37
回覆:63
積分:45
註冊:2004-05-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-24 16:25:02 IP:140.131.xxx.xxx 未訂閱
各位前輩小弟有一個問題是有關Cb、Cr運算影像問題,就是說一般影像可以取出Y,Cb,Cr,三個部份,現在想假設想要分別將Cb與Cr平方過後圖像Img2、Img3,另外cr/cb的影像Img4,並且所得到値都分佈在0~255之間,顯示處理過的Img2、Img3、Img4(Cb^2、Cr^2、cr/cb),以下是小弟收尋有關文章參考改好的,是因為Cb與Cb平方差不多,Cr也ㄧ樣,不知道那裡出了問題,看有沒有前被爲小弟解惑ㄧ下~~^^謝謝。    
 
 Graphics::TBitmap *Bmp = new Graphics::TBitmap();     Bmp->Assign(Image1->Picture->Bitmap);
 YBmp->Assign(Image1->Picture->Bitmap);
 CbBmp->Assign(Image1->Picture->Bitmap);
 CrBmp->Assign(Image1->Picture->Bitmap);
 Bmp->PixelFormat= pf24bit;
 YBmp->PixelFormat= pf24bit;
 CbBmp->PixelFormat= pf24bit;
 CrBmp->PixelFormat= pf24bit;
 int ll1,ll=0;     for(int H=0;HHeight;H  )
 {
  ptr = (Byte *)Bmp->ScanLine[H];
  Yptr  = (Byte *)YBmp->ScanLine[H];
  Cbptr = (Byte *)CbBmp->ScanLine[H];
  Crptr = (Byte *)CrBmp->ScanLine[H];       for(int W=0;WWidth;W  )
  {
   b=ptr[W*3];
   g=ptr[W*3 1];
   r=ptr[W*3 2];     int y = 0.299*r 0.587*g 0.114*b;
 int cr = 0.615*r-0.515*g-0.1*b 128;
 int cb = -0.147*r-0.289*g 0.436*b 128;
 int ok,ok1,ok2,cr_range,cr_range1,cb_range;    ok=255-cr;    //cbb是代表cb平方,値都在0~255之間
int cbb=(255*((cb*cb)-282.9124))/(57207.0724-282.9124);
//crr是代表cr平方,値都在0~255之間
int crr=(255*((ok*ok)-889.530))/(80556.630-889.530);
//ok1是代表cr/cb,値都在0~255之間
ok1=(255*((cr/cb) 0.1205))/(16.833 0.1205);      Cbptr[W*3]  =ok1;
  Cbptr[W*3 1]=Cbptr[W*3];
  Cbptr[W*3 2]=Cbptr[W*3];      Crptr[W*3]  =cbb;//
  Crptr[W*3 1]=Crptr[W*3];//
  Crptr[W*3 2]=Crptr[W*3];//      Yptr[W*3]  =crr;
  Yptr[W*3 1]=Yptr[W*3];
  Yptr[W*3 2]=Yptr[W*3];      }
 }     Image2->Picture->Assign(CbBmp);
 Image2->Show();
 Image4->Picture->Assign(CrBmp);
 Image4->Show();
 Image5->Picture->Assign(YBmp);
 Image5->Show();
 delete Bmp,YBmp,CbBmp,CrBmp;
sodesga
一般會員


發表:1
回覆:3
積分:0
註冊:2004-09-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-25 16:12:05 IP:202.39.xxx.xxx 未訂閱
要不要試試下面的轉換矩陣:     發表人 - sodesga 於 2005/08/25 16:18:39
keikojason
初階會員


發表:37
回覆:63
積分:45
註冊:2004-05-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-25 19:20:55 IP:140.131.xxx.xxx 未訂閱
換用這矩陣~~在處理過後畫面變成較暗的部分變亮,亮的變較暗,剛好顛捯相反,大致上沒有多大的影響。不過sodesga大大謝謝你的建議。
Royce520
高階會員


發表:18
回覆:157
積分:100
註冊:2002-09-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-29 15:14:35 IP:210.243.xxx.xxx 未訂閱
作法可以使用 8-bit R'G'B' 轉換到 Y'CbCr 係數如下: |Y'| | 16|   | 0.257  0.504  0.098|   |R'| |Cb|=|128| + |-0.148 -0.291  0.439| * |G'| |Cr| |128|   | 0.439 -0.368 -0.071|   |B'|    最後, 你將R'G'B'轉到Y'CbCr, 做了你想要的處理後... 應該還要反過來把CbCr訊號轉回到 R'G'B' 再存成圖檔 (返回運算可由上列方程式推出) <><>*真實的事物最美, 簡單的道理最好, 我能體會的 太少*
------
不要忘記呼吸,不要忘記編程! ∩__∩
keikojason
初階會員


發表:37
回覆:63
積分:45
註冊:2004-05-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-07 16:01:17 IP:140.131.xxx.xxx 未訂閱
引言: 最後, 你將R'G'B'轉到Y'CbCr, 做了你想要的處理後... 應該還要反過來把CbCr訊號轉回到 R'G'B' 再存成圖檔 (返回運算可由上列方程式推出) < face="Verdana, Arial, Helvetica"> 不好意思大大我還是聽不太懂你ㄉ意思~~是不是將R'G'B==>Y'CbCr==>Cb^2、Cr^2==>R'G'B==>顯示圖是這樣嗎? 那如果是這樣的話那我程式上要怎樣去修改呢?是以下這部份,還是別的地方

 
//cbb是代表cb平方,値都在0~255之間
int cbb=(255*((cb*cb)-282.9124))/(57207.0724-282.9124);
//crr是代表cr平方,値都在0~255之間
int crr=(255*((ok*ok)-889.530))/(80556.630-889.530);
//ok1是代表cr/cb,値都在0~255之間
ok1=(255*((cr/cb) 0.1205))/(16.833 0.1205);    
JerryKuo
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-08 10:40:18 IP:220.135.xxx.xxx 未訂閱
keikojason你好:    在做數學運算時,一定要很注意資料型態的轉換,
1. 例如浮點數乘於整數變數後,結果只剩整數部分,小數部分都被搶棄。
   0.999 變成 0, 這樣的結果差了將近1, 若用到平方就差更多。       建議這樣改
   double r, g, b;
   double y = 0.299*r 0.587*g 0.114*b;    2. 假設y是double, 要將y值當成像素值秀出成圖時,一定要先把double轉換成
   int, 如此秀出圖才會正確,不然很容易有亮點。
   e.g.
   Yptr[W*3]  = (int)y;
   
程式裡有很多都沒有注意這兩個環節,稍作修改應該就可以得到你想要的結果。
系統時間:2024-05-02 14:14:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!