keikojason
初階會員

 發表:37 回覆:63 積分:45 註冊:2004-05-10
發送簡訊給我
|
請問要怎樣用 "一張原圖4點取1點,之後再形成另一張圖";那如果將圖轉Y.Cr.Cb之後只有取Cr.Cb形成圖像這樣可以嘛..?那如果可以的話要怎樣將Cr.Cb取出不加上Y,再做圖像4點取1點...請各位前輩指教
|
1666362
初階會員

 發表:66 回覆:124 積分:43 註冊:2004-07-07
發送簡訊給我
|
這邊似乎是您要的
http://delphi.ktop.com.tw/topic.php?topic_id=46606 我是新手 多多指教 ^^
|
keikojason
初階會員

 發表:37 回覆:63 積分:45 註冊:2004-05-10
發送簡訊給我
|
再問各位前輩:如果有一張圖將圖轉Y.Cr.Cb之後,只取Cr.Cb形成圖像這樣可以嘛..?那如果可以的話那source code要怎樣撰寫,可以將Cr.Cb取出來形成圖像而不加上Y 的圖像
|
1666362
初階會員

 發表:66 回覆:124 積分:43 註冊:2004-07-07
發送簡訊給我
|
實在不懂 您說的什麼叫Y,Cr,Cb 我是新手 多多指教 ^^
|
keikojason
初階會員

 發表:37 回覆:63 積分:45 註冊:2004-05-10
發送簡訊給我
|
那就是說將原圖RGB成現圖轉成YCrCb圖..再將Cr.Cb取出來形成圖像而不加上Y 的圖像...
|
JerryKuo
版主
   
 發表:42 回覆:571 積分:322 註冊:2003-03-10
發送簡訊給我
|
引言:
那就是說將原圖RGB成現圖轉成YCrCb圖..再將Cr.Cb取出來形成圖像而不加上Y 的圖像...
keikojason你好: 先看下面這篇文章討論,
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=35589 印象中,Y Cr Cb就是YUV,(如果有錯,請糾正,我也很想知道到底差在哪裡)
Y的意義是影像的強度,數值是0~255,影像的灰階值大都用這個值代表。
UV的意義是影像的彩度,數值好像是0~64(不太確定),因為相鄰的
彩度都很想近,所以一般在做影像壓縮時,都用4:1:1比例儲存,
以節省影像儲存空間,也有人用4:2:1,4:2:2,4:4:4,壓縮率相對偏底,但
還原時,影像比較不會失真。 以下是我的建議
找一個正確RGB轉YUV的轉換程式,就是以四個像素為一單位區塊(正方形的區塊)
,分別算出四點的YUV,而"一張原圖4點取1點"的意思,應該就是YUV的比例4:1:1,
也就是一個單位有4個點,把四個Y都存,U和V分別將四點的U和V取平均存起來只存
一點。原始rgb圖經過YUV轉換後,就變成一個原始大小的灰階陣列(Y值)二個1/4
大小的彩度陣列(U和V),將UV陣列秀在bitmap上,就是你要的結果囉。
|
keikojason
初階會員

 發表:37 回覆:63 積分:45 註冊:2004-05-10
發送簡訊給我
|
JerryKuo你好:
你說的部分我懂你要傳達的意思...不過對於你說那篇文章討論,對於裡頭的source code運作不清除呢?我算新手....有點深度,有沒有比較簡單化得呢
|
JerryKuo
版主
   
 發表:42 回覆:571 積分:322 註冊:2003-03-10
發送簡訊給我
|
引言:
JerryKuo你好:
你說的部分我懂你要傳達的意思...不過對於你說那篇文章討論,對於裡頭的
source code運作不清除呢?我算新手....有點深度,有沒有比較簡單化得呢
>>< face="Verdana, Arial, Helvetica"> keikojason你好: 那篇文章的作法是YUV轉RGB,你要做的是RGB轉YUV,公式參考下面網站
http://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/yuv.html
RGB to YCbCr Y = 0.257R 0.504G 0.098B 16
Cb = -0.148R - 0.291G 0.439B 128
Cr = 0.439R - 0.368G - 0.071B 128 YCbCr to RGB R = 1.164(Y-16) 1.596(Cr-128)
G = 1.164(Y-16) - 0.391(Cb-128) - 0.813(Cr-128)
B = 1.164(Y-16) 2.018(Cb-128)
如果不會一次做Cb,Cr二個值,那就一個一個慢慢來
首先看公式,將每個點的Cr算出來,存在二唯陣列裡,
再對這個二唯陣列做縮小的動作,就像縮小影像一樣
4點取一點,縮成1/4大小,至於怎麼縮放請看小弟的拙作
內插法縮放(但不用完全照抄,只要四點取平均就好)
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=34732 做完縮放得到縮小的二唯陣列,將陣列秀在你想看的圖上就可以囉。 相同的方法,套用Cb的公式,得到二唯陣列,再秀出來就是Cb的圖 兩張圖應該是偏暗的,值域只有0~63。
|
keikojason
初階會員

 發表:37 回覆:63 積分:45 註冊:2004-05-10
發送簡訊給我
|
JerryKuo你好:
我還是不會用呢?..讓你看笑話囉~~ ![]() 因為對於他用的一些語法不是很了解所以不知道要怎樣著手,我開始想說要用一個 >..會不會應為我學沒有多久,對一些語法不會用.我有是這去找有關書籍..請前輩可以給小弟一些指導
|
justdo
高階會員
  
 發表:2 回覆:359 積分:222 註冊:2004-08-17
發送簡訊給我
|
不知道您是否真的有跑過前面幾位大大貼的文章和程式碼呢?
如果有,請把你真正遇到的瓶頸說出來
大家會很樂意幫你的忙
像現在這樣子感覺您只想讓別人幫你寫完整個程式
又或者您有嘗試過程式,但遇到的問題說的很模糊,
諸如:我用一個用不起來??是那邊用不起來?發生什麼情況?
完全讓人沒個譜,如何請人家幫助你呢? 基本上你要的程式流程應該分為幾個步驟:
1.建立三個Image物件,第一個存放你的原始影像
2.建立兩個陣列,大小為原始影像的四分之一,預備存放Cr, Cb的值
3.讀出影像每個pixel的RGB值
4.依序處理每個pixel,計算出Cr,Cb,並存到陣列去
5.將Cr, Cb的兩個陣列每四點取一點,寫到另外兩個Image物件去 基本上前面幾位大大的文章都有完成其中幾個步驟,
哪個步驟遇到問題在提出來問吧,但請記得把「問題點」提出來
|
TheMoon
中階會員
 
 發表:17 回覆:95 積分:67 註冊:2002-06-05
發送簡訊給我
|
引言:
JerryKuo你好:
我還是不會用呢?..讓你看笑話囉~~ 因為對於他用的一些語法不是很了解所以不知道要怎樣著手,我開始想說要用一個 >..會不會應為我學沒有多久,對一些語法不會用.我有是這去找有關書籍..請前輩可以給小弟一些指導
>>< face="Verdana, Arial, Helvetica">
不好意思插個花,
您提到"不會把他分開取出",
不知是否是指將24bits彩色影像之R,G,B值分開取出,
如果是的話可以參考下面的程式片段,
希望對您有幫助:
...
...
//宣告存放Y,Cb,Cr值的陣列
double Y[240][320],Cb[240][320],Cr[240][320];
//宣告存放R,G,B值的陣列
Byte R[240][320],G[240][320],B[240][320];
...
...
//分別取出R,G,B值
for(int j=0; jHeight; j )
{
ptr=(Byte *)Image1->Picture->Bitmap->ScanLine[j];
int index=0;
for(int i=0; iWidth; i )
{
B[j][i]=ptr[index];
G[j][i]=ptr[index 1];
R[j][i]=ptr[index 2];
index=index 3;
}
} //接著底下便可利用前面幾位大大提供的演算法及流程
//計算出Y,Cb,Cr並儲存起來
|
keikojason
初階會員

 發表:37 回覆:63 積分:45 註冊:2004-05-10
發送簡訊給我
|
各位大大以下是我依照大大提示的方式下撰寫,不過就是有問題還是邏輯錯誤,在這之中我有加一段判斷假設在這範圍中就255(白色)不事的話1(黑色)不過我好像沒有將他分開儲存在YCbCr矩陣中,取出我要的CbCr,問大大我現在是哪裡有問題啊...請各位大大指教 ![]() ..^^
< class="code">
//全域宣告
int Y[320][240];
int Cb[320][240];
int Cr[320][240];
========================
int R[320][240];
int G[320][240];
int B[320][240];
Graphics::TBitmap *Bmp = new Graphics::TBitmap(); Bmp->Assign(Image1->Picture->Bitmap); for(int j=0; j Height; j )
{
ptr = (Byte *)Bmp->ScanLine[j];
int index=0;
for(i=0;iWidth;i )
{ B[j][i]=ptr[index*3];
G[j][i]=ptr[index*3 1];
R[j][i]=ptr[index*3 2];
Y [j][i]= 0.299*R[j][i] 0.587*G[j][i] 0.114*B[j][i];
Cr [j][i]= 0.5*R[j][i]-0.419*G[j][i]-0.081*B[j][i] 128;
Cb [j][i]= -0.169*R[j][i]-0.332*G[j][i] 0.5*B[j][i] 128;
if(Cr>133&&Cr<173&&Cb>77&&Cb<127)
{ Y=255,Cr=255,Cb=255;
ptr[i*3]=Y;
ptr[i*3 1]=Cr;
ptr[i*3 2]=Cb; }
else
{ Y=0,Cr=0,Cb=0;
ptr[i*3]=Y;
ptr[i*3 1]=Cr;
ptr[i*3 2]=Cb; }
}
}
Image2->Picture->Assign(Bmp);
Image2->Show();
delete Bmp;
}
|
JerryKuo
版主
   
 發表:42 回覆:571 積分:322 註冊:2003-03-10
發送簡訊給我
|
引言:
各位大大以下是我依照大大提示的方式下撰寫,不過就是有問題還是邏輯錯誤,在這之中我有加一段判斷假設在這範圍中就255(白色)不事的話1(黑色)不過我好像沒有將他分開儲存在YCbCr矩陣中,取出我要的CbCr,問大大我現在是哪裡有問題啊...請各位大大指教 ..^^
< class="code">
//全域宣告
int Y[320][240];
int Cb[320][240];
int Cr[320][240];
========================
int R[320][240];
int G[320][240];
int B[320][240];
Graphics::TBitmap *Bmp = new Graphics::TBitmap(); Bmp->Assign(Image1->Picture->Bitmap); for(int j=0; jHeight; j )
{
ptr = (Byte *)Bmp->ScanLine[j];
int index=0;
for(i=0;iWidth;i )
{ B[j][i]=ptr[index*3];
G[j][i]=ptr[index*3 1];
R[j][i]=ptr[index*3 2];
Y [j][i]= 0.299*R[j][i] 0.587*G[j][i] 0.114*B[j][i];
Cr [j][i]= 0.5*R[j][i]-0.419*G[j][i]-0.081*B[j][i] 128;
Cb [j][i]= -0.169*R[j][i]-0.332*G[j][i] 0.5*B[j][i] 128;
if(Cr>133&&Cr<173&&Cb>77&&Cb<127)
{ Y=255,Cr=255,Cb=255;
ptr[i*3]=Y;
ptr[i*3 1]=Cr;
ptr[i*3 2]=Cb; }
else
{ Y=0,Cr=0,Cb=0;
ptr[i*3]=Y;
ptr[i*3 1]=Cr;
ptr[i*3 2]=Cb; } }
}
Image2->Picture->Assign(Bmp);
Image2->Show();
delete Bmp;
}
keikojason你好: 這個程式真的是針對你的問題來寫的嗎?紅色部分是做什麼用的?還有compiler
會過嗎? 如果真想得到別人的幫忙,自己先付出心力把程式寫好,這已不是新不新手
的問題。
|
TheMoon
中階會員
 
 發表:17 回覆:95 積分:67 註冊:2002-06-05
發送簡訊給我
|
引言:
各位大大以下是我依照大大提示的方式下撰寫,不過就是有問題還是邏輯錯誤,在這之中我有加一段判斷假設在這範圍中就255(白色)不事的話1(黑色)不過我好像沒有將他分開儲存在YCbCr矩陣中,取出我要的CbCr,問大大我現在是哪裡有問題啊...請各位大大指教 ..^^
< class="code">
//問題一:請先確認以下陣列的維度 -> int A[Height][Width];
//全域宣告
int Y[320][240];
int Cb[320][240];
int Cr[320][240];
//========================
int R[320][240];
int G[320][240];
int B[320][240]; Graphics::TBitmap *Bmp = new Graphics::TBitmap();
Bmp->Assign(Image1->Picture->Bitmap); for(int j=0; jHeight; j )
{
ptr = (Byte *)Bmp->ScanLine[j];
//問題二:index沒有累加 -> 請參考之前提拱給您的作法
int index=0;
for(i=0;iWidth;i )
{
B[j][i]=ptr[index*3];
G[j][i]=ptr[index*3 1];
R[j][i]=ptr[index*3 2]; Y[j][i] = 0.299*R[j][i] 0.587*G[j][i] 0.114*B[j][i];
Cr[j][i] = 0.5*R[j][i]-0.419*G[j][i]-0.081*B[j][i] 128;
Cb[j][i] = -0.169*R[j][i]-0.332*G[j][i] 0.5*B[j][i] 128; //問題三:請注意YCbCr與RGB資料所代表的意義不一樣
if(Cr>133 && Cr<173 && Cb>77 && Cb<127)
{
Y=255,Cr=255,Cb=255;
ptr[i*3]=Y;
ptr[i*3 1]=Cr;
ptr[i*3 2]=Cb;
}
else
{
Y=0,Cr=0,Cb=0;
ptr[i*3]=Y;
ptr[i*3 1]=Cr;
ptr[i*3 2]=Cb;
}
}
} Image2->Picture->Assign(Bmp);
Image2->Show();
delete Bmp;
提供您YCbCr相關資料:
http://www.hdtvforum.com.tw/toppage2.htm
|
keikojason
初階會員

 發表:37 回覆:63 積分:45 註冊:2004-05-10
發送簡訊給我
|
輸入圖形為320*240(Image1),將圖形先轉成RGB儲存在不同的矩陣中,再分別轉到YCbCr矩陣裡,接著取出CbCr做範圍裡的判斷,至於紅色部分就是判斷部分,判斷假設Cb與Cr在範圍中就為255(白色)不是的話為1(黑色),之後再4點取一點輸出2值圖像(Image2)我是想說是不是型態不一樣而造成compiler有錯誤,那要怎樣改才可以呢?還有我再做取出CbCr中,是不是沒有儲存好還是有其他原因呢?請大大指教....小弟細心候教
//全域宣告
int Y[320][240];
int Cb[320][240];
int Cr[320][240];
//========================
int R[320][240];
int G[320][240];
int B[320][240];
int temp[320][240];
Graphics::TBitmap *Bmp = new Graphics::TBitmap(); Bmp->Assign(Image1->Picture->Bitmap); for(int j=0; jHeight; j )
{
ptr = (Byte *)Bmp->ScanLine[j];
int index=0;
for(i=0;iWidth;i )
{
B[j][i]=ptr[index*3];
G[j][i]=ptr[index*3 1];
R[j][i]=ptr[index*3 2];
index=index 3;
Y[j][i] = 0.299*R[j][i] 0.587*G[j][i] 0.114*B[j][i];
Cr[j][i] = 0.5*R[j][i]-0.419*G[j][i]-0.081*B[j][i] 128;
Cb[j][i] = -0.169*R[j][i]-0.332*G[j][i] 0.5*B[j][i] 128; for(int j=0; jHeight; j )
{
ptr = (Byte *)Bmp->ScanLine[j];
int index=0;
for(i=0;iWidth;i )
{ if(Cr>133 && Cr<173 && Cb>77 && Cb<127)
{
Y=255,Cr=255,Cb=255;
ptr[index*3]=Y;
ptr[index*3 1]=Cr;
ptr[index*3 2]=Cb;
index=index 3;
}
else
{
Y=0,Cr=0,Cb=0;
ptr[index*3]=Y;
ptr[index*3 1]=Cr;
ptr[index*3 2]=Cb;
index=index 3;
}
}
}
}
} Image2->Picture->Assign(Bmp);
Image2->Show();
delete Bmp;
|
JerryKuo
版主
   
 發表:42 回覆:571 積分:322 註冊:2003-03-10
發送簡訊給我
|
|