Re: [問題] 請問用C++寫簡單的影像處理程式的問題

看板Programming作者時間18年前 (2007/09/21 10:11), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
※ 引述《swwu83.bbs@bbs.wretch.cc ()》之銘言: : ※ 引述《Mewra.bbs@ptt.cc》之銘言: : > 已先將圖檔讀入, : > 並已寫好 RGB轉YUV 及 YUV轉RGB兩個function. : > 圖檔在經過這兩個function轉換後還是為原來的圖檔, : > 所以這兩個function內的轉換公式是正確的. : > 現在新寫一個function做subsampling, : > 我試寫了一個4:2:2的subsampling, 並將其置入上兩個function之間, : > RGBtoYUV(); // 將Rbuf,Gbuf,Bbuf的資料轉換成Ybuf,Ubuf,Vbuf陣列 : > // 簡單的試做看看4:2:2的subsampling : > for( int i = 0 ; i < Width * Height; i++ ) : > { : > Ubuf[i] = (Ubuf[i-1] + Ubuf[i+1])/2; : > Vbuf[i] = (Vbuf[i-1] + Vbuf[i+1])/2; : > } : > YUVtoRGB(); // 將Vbuf,Ubuf,Vbuf轉回Rbuf,Gbuf,Bbuf : > 結果經過subsampling後, 圖上一堆一點一點, 找了好久還是不知該怎麼解 : > 請問有人遇過同樣的問題嗎? 謝 : 1. 你是將YUV422的圖片用YUV444解回去 : 2. 你的取樣不對 你的第i項是i-1項跟i+1項的平均 : i+1又是 i跟i+2平均 也就是說 越到後面會越不純 : 另外我看了一下你的迴圈是跑 Width*Height 次 : 如果你是要得到YUV422 的話 你的Ubuf跟Vbuf的容量應該只需要一半喔 : 也就是只需要 Width*Height/2 次即可 : 另外 在處理的時候 要記得以行為單位 : 這樣寫比較對 : for(int i=0;i< Width*Height;i+=2) : { : Ubuf2[i>>1] = (Ubuf[i] + Ubuf[i+1])/2; : Vbuf2[i>>1] = (Vbuf[i] + Vbuf[i+1])/2; : } : Ubuf2 Vbuf2 是另外宣告的陣列 大小是Ubuf的一半 謝謝回答, 另外問題已找到... 在讀取圖檔至RGB char array後, 在做轉換至YUV space時, 我沒有把raw data強制cast成unsigned char, 所以顏色range完全跑掉. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 69.235.252.176
文章代碼(AID): #16yoWzNE (Programming)
文章代碼(AID): #16yoWzNE (Programming)