看板Programming
标 题Re: [问题] 请问用C++写简单的影像处理程式的问题
发信站无名小站 (Wed Sep 19 22:16:44 2007)
转信站ptt!ctu-reader!ctu-gate!news.nctu!news.ntu!news.ee.ttu!csnews.cs.nctu!
※ 引述《[email protected]》之铭言:
> 已先将图档读入,
> 并已写好 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海