作者Mewra ()
看板Programming
标题Re: [问题] 请问用C++写简单的影像处理程式的问题
时间Fri Sep 21 10:11:08 2007
※ 引述《[email protected] ()》之铭言:
: ※ 引述《[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的一半
谢谢回答,
另外问题已找到...
在读取图档至RGB char array後,
在做转换至YUV space时,
我没有把raw data强制cast成unsigned char,
所以颜色range完全跑掉.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 69.235.252.176