latest version v1.9 - last update 10 Apr 2010 |
Computes the YUV values from a given RGB color representation (rgbPixel). More...
#include <ltiSplitImageToYUV.h>
Public Member Functions | |
splitImageToYUV () | |
splitImageToYUV (const splitImageToYUV &other) | |
virtual | ~splitImageToYUV () |
virtual const char * | getTypeName () const |
splitImageToYUV & | copy (const splitImageToYUV &other) |
splitImageToYUV & | operator= (const splitImageToYUV &other) |
virtual functor * | clone () const |
virtual bool | apply (const rgbPixel &pixel, float &c1, float &c2, float &c3) const |
virtual bool | apply (const rgbPixel &pixel, ubyte &c1, ubyte &c2, ubyte &c3) const |
virtual bool | apply (const image &img, channel &c1, channel &c2, channel &c3) const |
virtual bool | apply (const image &img, channel8 &c1, channel8 &c2, channel8 &c3) const |
Computes the YUV values from a given RGB color representation (rgbPixel).
In the literature, technical and scientific, there is a confusion between the color spaces YUV, YCrCb and YPbPr. Poynton in http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html explains that YUV is usually never correctly meant, because the color space normally used for component digital video is the YCrCb (ITU-RS601 or CCIR-601). Other devices use the YPbPr, but the "real" YUV is usually not employed.
The LTI-Lib provides all three spaces:
This functor splits an RGB images into the color space YUV as described in the Poynton reference given above.
Here, RGB are values in the intervall [0,1]. Within this range, the excursion for Y is also from 0.0 to 1.0, the excursion of U is from -0.436 to 0.436 and V varies from -0.615 to 0.615. These ranges are respected in the implentation for float
types (lti::channel).
If you use ubyte
(lti::channel8), then the values for U and V are linearly mapped from 0 to 1, which results in the mapping
Y = 0.299*R + 0.587*G + 0.114*B U = -0.169*R - 0.331*G + 0.500*B + 128.0 V = 0.500*R - 0.419*G - 0.081*B + 128.0
The former mapping is equivalent to the color space YPbPr scaled in such a way that "black" is mapped to Y=0 and "white" to Y=255, and the Pb and Pr channels, which acquire values from -0.5 to 0.5, are linearly mapped to the inteval [0,255] as well. In other words, for ubyte
operations it is equivalent to use this functor or lti::splitImageToYPbPr (which is maybe better named as the value ratios are at least kept there).
lti::splitImageToYUV::splitImageToYUV | ( | ) |
default constructor
lti::splitImageToYUV::splitImageToYUV | ( | const splitImageToYUV & | other | ) |
copy constructor
other | the object to be copied |
virtual lti::splitImageToYUV::~splitImageToYUV | ( | ) | [virtual] |
destructor
virtual bool lti::splitImageToYUV::apply | ( | const image & | img, | |
channel8 & | c1, | |||
channel8 & | c2, | |||
channel8 & | c3 | |||
) | const [virtual] |
Split image into 8-bit channels.
N.B.: when casting the transformation result to unsigned shorts (8-bit channel) major rounding errors will occur.
As a result, the merging operation might produce negative values or values > 1, which are truncated subsequently. When accurate Y, U and V values are required, prefer float values.
Implements lti::splitImage.
virtual bool lti::splitImageToYUV::apply | ( | const image & | img, | |
channel & | c1, | |||
channel & | c2, | |||
channel & | c3 | |||
) | const [virtual] |
split pixel into float channels
Implements lti::splitImage.
bool lti::splitImageToYUV::apply | ( | const rgbPixel & | pixel, | |
ubyte & | c1, | |||
ubyte & | c2, | |||
ubyte & | c3 | |||
) | const [inline, virtual] |
Split pixel into 8-bit values (between 0 and 255).
N.B.: when casting the transformation result to unsigned shorts (8-bit channel) major rounding errors will occur.
As a result, the merging operation might produce negative values or values > 1, which are truncated subsequently.
When accurate Y, U and V values are required, prefer float values
Implements lti::splitImage.
References lti::rgbPixel::getBlue(), lti::rgbPixel::getGreen(), and lti::rgbPixel::getRed().
bool lti::splitImageToYUV::apply | ( | const rgbPixel & | pixel, | |
float & | c1, | |||
float & | c2, | |||
float & | c3 | |||
) | const [inline, virtual] |
split pixel into float values (between 0 and 1)
Implements lti::splitImage.
References lti::rgbPixel::getBlue(), lti::rgbPixel::getGreen(), and lti::rgbPixel::getRed().
virtual functor* lti::splitImageToYUV::clone | ( | ) | const [virtual] |
returns a pointer to a clone of this functor.
Implements lti::functor.
splitImageToYUV& lti::splitImageToYUV::copy | ( | const splitImageToYUV & | other | ) |
copy data of "other" functor.
other | the functor to be copied |
Reimplemented from lti::splitImage.
virtual const char* lti::splitImageToYUV::getTypeName | ( | ) | const [virtual] |
returns the name of this type ("splitImageToYUV")
Reimplemented from lti::splitImage.
splitImageToYUV& lti::splitImageToYUV::operator= | ( | const splitImageToYUV & | other | ) |
alias for copy member
other | the functor to be copied |
Reimplemented from lti::splitImage.