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

問要怎樣做圖形改變

答題得分者是:TheMoon
keikojason
初階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-17 15:28:26 IP:163.28.xxx.xxx 未訂閱
請問要怎樣用"一張原圖4點取1點,之後再形成另一張圖";那如果將圖轉Y.Cr.Cb之後只有取Cr.Cb形成圖像這樣可以嘛..?那如果可以的話要怎樣將Cr.Cb取出不加上Y,再做圖像4點取1點...請各位前輩指教
1666362
初階會員


發表:66
回覆:124
積分:43
註冊:2004-07-07

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-17 16:28:29 IP:61.222.xxx.xxx 未訂閱
這邊似乎是您要的 http://delphi.ktop.com.tw/topic.php?topic_id=46606 我是新手 多多指教 ^^
keikojason
初階會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-18 11:44:42 IP:163.28.xxx.xxx 未訂閱
再問各位前輩:如果有一張圖將圖轉Y.Cr.Cb之後,只取Cr.Cb形成圖像這樣可以嘛..?那如果可以的話那source code要怎樣撰寫,可以將Cr.Cb取出來形成圖像而不加上Y 的圖像
1666362
初階會員


發表:66
回覆:124
積分:43
註冊:2004-07-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-18 12:03:16 IP:61.222.xxx.xxx 未訂閱
實在不懂 您說的什麼叫Y,Cr,Cb 我是新手 多多指教 ^^
keikojason
初階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-18 12:40:00 IP:163.28.xxx.xxx 未訂閱
那就是說將原圖RGB成現圖轉成YCrCb圖..再將Cr.Cb取出來形成圖像而不加上Y 的圖像...
JerryKuo
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-18 13:22:23 IP:220.135.xxx.xxx 未訂閱
引言: 那就是說將原圖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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-18 17:16:51 IP:163.28.xxx.xxx 未訂閱
JerryKuo你好: 你說的部分我懂你要傳達的意思...不過對於你說那篇文章討論,對於裡頭的source code運作不清除呢?我算新手....有點深度,有沒有比較簡單化得呢
JerryKuo
版主


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-11-18 18:52:12 IP:220.135.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-11-27 13:48:38 IP:218.169.xxx.xxx 未訂閱
JerryKuo你好:   我還是不會用呢?..讓你看笑話囉~~因為對於他用的一些語法不是很了解所以不知道要怎樣著手,我開始想說要用一個 >..會不會應為我學沒有多久,對一些語法不會用.我有是這去找有關書籍..請前輩可以給小弟一些指導
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-11-27 17:50:05 IP:221.169.xxx.xxx 未訂閱
不知道您是否真的有跑過前面幾位大大貼的文章和程式碼呢? 如果有,請把你真正遇到的瓶頸說出來 大家會很樂意幫你的忙 像現在這樣子感覺您只想讓別人幫你寫完整個程式 又或者您有嘗試過程式,但遇到的問題說的很模糊, 諸如:我用一個用不起來??是那邊用不起來?發生什麼情況? 完全讓人沒個譜,如何請人家幫助你呢? 基本上你要的程式流程應該分為幾個步驟: 1.建立三個Image物件,第一個存放你的原始影像 2.建立兩個陣列,大小為原始影像的四分之一,預備存放Cr, Cb的值 3.讀出影像每個pixel的RGB值 4.依序處理每個pixel,計算出Cr,Cb,並存到陣列去 5.將Cr, Cb的兩個陣列每四點取一點,寫到另外兩個Image物件去 基本上前面幾位大大的文章都有完成其中幾個步驟, 哪個步驟遇到問題在提出來問吧,但請記得把「問題點」提出來
TheMoon
中階會員


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-11-29 12:50:57 IP:202.39.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-12-01 20:12:19 IP:163.28.xxx.xxx 未訂閱
各位大大以下是我依照大大提示的方式下撰寫,不過就是有問題還是邏輯錯誤,在這之中我有加一段判斷假設在這範圍中就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; }
JerryKuo
版主


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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-12-02 09:07:44 IP:220.135.xxx.xxx 未訂閱
引言: 各位大大以下是我依照大大提示的方式下撰寫,不過就是有問題還是邏輯錯誤,在這之中我有加一段判斷假設在這範圍中就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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-12-02 11:45:17 IP:202.39.xxx.xxx 未訂閱
引言: 各位大大以下是我依照大大提示的方式下撰寫,不過就是有問題還是邏輯錯誤,在這之中我有加一段判斷假設在這範圍中就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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-12-02 14:02:14 IP:163.28.xxx.xxx 未訂閱
輸入圖形為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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-12-02 17:42:14 IP:220.135.xxx.xxx 未訂閱
keikojason你好:    不想多廢口舌,原理都在上面幾篇文章, 這是一個很簡單的程式,寫不寫得出來;不是新不新手的問題, 是有沒有用心的問題。    RGB to YCbCr BCB程式碼 http://delphi.ktop.com.tw/loadfile.php?TOPICID=19029161&CC=425579
系統時間:2024-11-25 1:34:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!