問要怎樣做圖形改變 |
答題得分者是:TheMoon
|
keikojason
初階會員 發表:37 回覆:63 積分:45 註冊:2004-05-10 發送簡訊給我 |
|
1666362
初階會員 發表:66 回覆:124 積分:43 註冊:2004-07-07 發送簡訊給我 |
|
keikojason
初階會員 發表:37 回覆:63 積分:45 註冊:2004-05-10 發送簡訊給我 |
|
1666362
初階會員 發表:66 回覆:124 積分:43 註冊:2004-07-07 發送簡訊給我 |
|
keikojason
初階會員 發表:37 回覆:63 積分:45 註冊:2004-05-10 發送簡訊給我 |
|
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
版主 發表: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.htmlRGB 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 發送簡訊給我 |
|
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; j |
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
|
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; jkeikojason你好: 這個程式真的是針對你的問題來寫的嗎?紅色部分是做什麼用的?還有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; j提供您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; j |
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
keikojason你好: 不想多廢口舌,原理都在上面幾篇文章,
這是一個很簡單的程式,寫不寫得出來;不是新不新手的問題,
是有沒有用心的問題。 RGB to YCbCr BCB程式碼
http://delphi.ktop.com.tw/loadfile.php?TOPICID=19029161&CC=425579
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |