Hi, I coded some routines for YCbCr <-> RGB conversion, both using floating point numbers and using integer arithmetics, code is attached. Let's say I want to convert from RGB to YCbCr and back. First the integer arithmetics: In [1]: from colors import * In [2]: a = [255, 0, 255] In [3]: RGB2YCbCr(a) Out[3]: (107, 202, 222) In [4]: YCbCr2RGB(RGB2YCbCr(a)) Out[4]: array([255, 1, 255]) As you can see, the G component was increased from 0 to 1. Those routines are the same as here: http://msdn.microsoft.com/en-us/library/ms893078.aspx Now let's try floating point conversions: In [3]: RGB2YCbCr_precise(a) Out[3]: array([106, 202, 222], dtype=uint8) In [4]: YCbCr2RGB_precise(RGB2YCbCr_precise(a)) Out[4]: array([255, 0, 254], dtype=uint8) This time the B component was decreased by 1... Those floating point routines were done by me, and I followed the theora spec. So my questions are: * does anyone here have a code, that can convert back and forth without loosing precision? * does it make sense for those routines to work back and forth exactly? I am new to this, so I am not sure what the common practise is, but it seems weird to me, that if I convert the picture from YCbCr to RGB and back couple times, the image will slowly deteriorate. Ondrej -------------- next part -------------- A non-text attachment was scrubbed... Name: colors.py Type: text/x-python Size: 2639 bytes Desc: not available Url : http://lists.xiph.org/pipermail/theora/attachments/20090615/9541fd47/attachment.py
2009/6/16 Ondrej Certik <ondrej at certik.cz>:> Hi, > > I coded some routines for YCbCr <-> RGB conversion, both using > floating point numbers and using integer arithmetics, code is > attached. > > Let's say I want to convert from RGB to YCbCr and back. First the > integer arithmetics: > > In [1]: from colors import * > > In [2]: a = [255, 0, 255] > > In [3]: RGB2YCbCr(a) > Out[3]: (107, 202, 222) > > In [4]: YCbCr2RGB(RGB2YCbCr(a)) > Out[4]: array([255, ? 1, 255]) > > > As you can see, the G component was increased from 0 to 1. Those > routines are the same as here: > > http://msdn.microsoft.com/en-us/library/ms893078.aspx > > Now let's try floating point conversions: > > In [3]: RGB2YCbCr_precise(a) > Out[3]: array([106, 202, 222], dtype=uint8) > > In [4]: YCbCr2RGB_precise(RGB2YCbCr_precise(a)) > Out[4]: array([255, ? 0, 254], dtype=uint8) > > This time the B component was decreased by 1... Those floating point > routines were done by me, and I followed the theora spec. > > So my questions are: > > * does anyone here have a code, that can convert back and forth > without loosing precision? > * does it make sense for those routines to work back and forth exactly? > > I am new to this, so I am not sure what the common practise is, but it > seems weird to me, that if I convert the picture from YCbCr to RGB and > back couple times, the image will slowly deteriorate.Have you compared to the code in liboggplay? (speaking of which, python bindings to liboggplay would be elite -- that would add audio, sync and seeking support :-) Conrad.
> does anyone here have a code, that can convert back and > forth without loosing precision? > does it make sense for those routines to work back and forth exactly?AFAIK impossible. BTW, if anyone has good docs about those colorspaces + YUV4MPEG file format, please post them. Oops, I had asked this already in the past. -- ~~~ wow ~~~