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

RGB to YUV YUV toRGB

尚未結案
p00003816912
一般會員


發表:1
回覆:1
積分:0
註冊:2009-11-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-11-28 16:25:15 IP:114.36.xxx.xxx 訂閱
 問題是寫一個先讀入bmp檔,然後將其rgb值取出後轉成yuv,再將yuv值轉成rgb後輸出,以下是我這兩個轉換過程用的code
跑出來顏色非常明顯的跑掉,試過兩個公式都會跑掉,所以應該是我程式碼的問題,請各位大大幫忙看看,應該不會花多少時間,謝謝~

1、rgb to yuv
for(int i=0;iPicture->Bitmap->Height;i )
{
for(int j=0;jPicture->Bitmap->Width;j )
{
tempY[j][i]= (GetRValue(Image1->Canvas->Pixels[j][i])*0.299) (GetGValue(Image1->Canvas->Pixels[j][i])*0.587) (GetBValue(Image1->Canvas->Pixels[j][i])*114);
if(tempY[j][i]>255)
tempY[j][i]=255;
if(tempY[j][i]<0)
tempY[j][i]=0;
if(i%2==0 && j%2==0)
{
tempU[j/2][i/2]=0.493*(GetBValue(Image1->Canvas->Pixels[j][i])-tempY[j][i]);
tempV[j/2][i/2]=0.877*(GetRValue(Image1->Canvas->Pixels[j][i])-tempY[j][i]);
if(tempU[j/2][i/2]>127)
tempU[j/2][i/2]=127;
if(tempU[j/2][i/2]<-128)
tempU[j/2][i/2]=(-128);
if(tempV[j/2][i/2]>127)
tempV[j/2][i/2]=127;
if(tempV[j/2][i/2]<-128)
tempV[j/2][i/2]=(-128);
}
}
}

2、 yuv to rgb
for(int i=0;i<(Image1->Picture->Bitmap->Height);i )
{
for(int j=0;j<(Image1->Picture->Bitmap->Width);j )
{
tempB=(tempU[j/2][i/2] 0.493*tempY[j][i])/0.493;
tempR=(tempV[j/2][i/2] 0.877*tempY[j][i])/0.877;
tempG=(tempY[j][i]-0.144*tempB-0.299*tempR)/0.587;
if(tempR>255)tempR=255;
if(tempG>255)tempG=255;
if(tempB>255)tempB=255;
if(tempR<0)tempR=0;
if(tempG<0)tempG=0;
if(tempB<0)tempB=0;
Image2->Canvas->Pixels[j][i]=(TColor)RGB(tempR,tempG,tempB);
}
}

公式:
Y=0.299R 0.587G 0.114B - (1)
U=0.493(B-Y) -(2)
V=0.877(R-Y) -(3)

由 (2) (3) 得
(U 0.493Y)/ 0.493 =B -(4)
(V 0.877Y)/ 0.877 =R -(5)
由(1)(4)(5)得
(Y-0.114B-0.299R)/0.587=G
謝謝各位大大~

編輯記錄
p00003816912 重新編輯於 2009-11-28 16:26:27, 註解 無‧
istillloving
高階會員


發表:33
回覆:182
積分:183
註冊:2008-10-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-11-29 11:47:09 IP:140.127.xxx.xxx 訂閱
為什麼UV需要這個判斷式

可以說明一下嗎

if(i%2==0 && j%2==0)
{

}

而且 奇怪了...

我上維基查轉換公是怎麼跟你的不太一樣

http://zh.wikipedia.org/wiki/YUV

而且看你的正規化用法就知道你不了解YUV是啥

YUV的範圍你要搞清楚不能亂正規化

前面加個byte給他吧 ----->> (byte)GetRValue(Image1->Canvas->Pixels[j][i])

加個byte之後 random variable 轉出來的絕對會落在範圍內 不用再一次正規劃



------
恩...
編輯記錄
istillloving 重新編輯於 2009-11-29 11:50:19, 註解 無‧
istillloving 重新編輯於 2009-11-29 11:53:15, 註解 無‧
istillloving 重新編輯於 2009-11-29 11:59:04, 註解 無‧
p00003816912
一般會員


發表:1
回覆:1
積分:0
註冊:2009-11-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-11-30 17:25:36 IP:140.138.xxx.xxx 訂閱
 啊    這個程式其實是要做dct轉換的,才有那個判斷式

我真的不怎麼了解bcb和相關的影像處理,還在慢慢研究中

等下來用大大說的把全部都轉成byte方式來試試

先謝謝大大囉~
istillloving
高階會員


發表:33
回覆:182
積分:183
註冊:2008-10-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-11-30 22:34:59 IP:220.129.xxx.xxx 訂閱
可是我記得之前寫過轉DCT的時候好像也沒啥判斷式....

http://zh.wikipedia.org/zh-tw/DCT

好像就是一個灰階點 轉成一個DCT點

8*8轉出來還是8*8

只不過越靠近(0,0) 越低頻

加油啦
------
恩...
系統時間:2024-03-28 23:37:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!