Re: [問題] 請問用C++寫簡單的影像處理程式的問題
※ 引述《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的一半
--
我的程式設計網誌
http://blog.yam.com/swwuyam
--
夫兵者不祥之器物或惡之故有道者不處君子居則貴左用兵則貴右兵者不祥之器非君子
之器不得已而用之恬淡為上勝而不美而美之者是樂殺人夫樂殺人者則不可得志於天下
矣吉事尚左凶事尚右偏將軍居左上將軍居右言以喪禮處之殺人之眾以哀悲泣之戰勝以
喪禮處之道常無名樸雖小天下莫能臣侯王若能守之萬物將自賓天地相合以降甘露民莫
之令而自均始制有名名亦既有夫亦將知止知止可以不殆譬道之在天 61.57.152.222海
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):
Programming 近期熱門文章
PTT數位生活區 即時熱門文章