Re: [問題] 請問用C++寫簡單的影像處理程式的問題
※ 引述《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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
Programming 近期熱門文章
PTT數位生活區 即時熱門文章