Templates -- Meow  1.1.4
A C++ template which is unable and also not allowed to compile to obj-file first.
YUV.hpp
Go to the documentation of this file.
1 #include <algorithm>
2 #include "RGB.h"
3 #include "../utility.h"
4 
5 namespace meow{
6  template<class T> inline YUV<T>::YUV(){ }
7  template<class T> inline YUV<T>::YUV(T const& y, T const& u, T const& v){
8  yuv_[0] = y; yuv_[1] = u; yuv_[2] = v;
9  }
10  template<class T> inline YUV<T>::YUV(T const* yuv){
11  for(int i = 0; i < 3; i++){
12  yuv_[i] = yuv[i];
13  }
14  }
16  template<class T> inline T YUV<T>::y() const { return yuv_[0]; }
17  template<class T> inline T YUV<T>::u() const { return yuv_[1]; }
18  template<class T> inline T YUV<T>::v() const { return yuv_[2]; }
19  template<class T> inline T YUV<T>::yuv(size_t i) const {
20  return yuv_[std::min((size_t)3 - 1, i)];
21  }
22  template<class T> inline T YUV<T>::vuy(size_t i) const {return yuv(2-i);}
24  template<class T> inline T YUV<T>::y(T const& val){return (yuv_[0]=val);}
25  template<class T> inline T YUV<T>::u(T const& val){return (yuv_[1]=val);}
26  template<class T> inline T YUV<T>::v(T const& val){return (yuv_[2]=val);}
27  template<class T> inline T YUV<T>::yuv(size_t i, T const& val){
28  i = std::min((size_t)3 - 1, i);
29  return (yuv_[i] = val);
30  }
31  template<class T> inline T YUV<T>::vuy(size_t i, T const& val){
32  return yuv(2 - i, val);
33  }
34 
35  inline YUVf:: YUVf(): YUV(0.0, 0.0, 0.0){ }
36  inline YUVf::~YUVf(){ }
37  inline YUVf::YUVf(double const& y, double const& u, double const& v): YUV(y, u, v){ }
38  inline YUVf::YUVf(double const* yuv): YUV(yuv){ }
39  inline double YUVf::yMin() const { return 0.0; }
40  inline double YUVf::yMax() const { return 1.0; }
41  inline double YUVf::uMin() const { return 0.0; }
42  inline double YUVf::uMax() const { return 1.0; }
43  inline double YUVf::vMin() const { return 0.0; }
44  inline double YUVf::vMax() const { return 1.0; }
45 
46 
47  template<class RGB_T, class YUV_T> inline void RGB_to_YUV(
48  RGB<RGB_T> const& rgb,
49  YUV<YUV_T> * yuv){
50  double r = normalize(rgb.rMin(), rgb.rMax(), rgb.r());
51  double g = normalize(rgb.gMin(), rgb.gMax(), rgb.g());
52  double b = normalize(rgb.bMin(), rgb.bMax(), rgb.b());
53  double y = 0.299 * r + 0.587 * g + 0.114 * b;
54  double u = -0.169 * r - 0.331 * g + 0.500 * b + 0.5;
55  double v = 0.500 * r - 0.419 * g - 0.081 * b + 0.5;
56  yuv->y(denormalize(yuv->yMin(), yuv->yMax(), y));
57  yuv->u(denormalize(yuv->uMin(), yuv->uMax(), u));
58  yuv->v(denormalize(yuv->vMin(), yuv->vMax(), v));
59  }
60  template<class YUV_T, class RGB_T> inline void YUV_to_RGB(
61  YUV<YUV_T> const& yuv,
62  RGB<RGB_T> * rgb){
63  double y = normalize(yuv.yMin(), yuv.yMax(), yuv.y());
64  double u = normalize(yuv.uMin(), yuv.uMax(), yuv.u());
65  double v = normalize(yuv.vMin(), yuv.vMax(), yuv.v());
66  double r = y - 0.00093 * (u - 0.5) + 1.401687 * (v - 0.5);
67  double g = y - 0.34370 * (u - 0.5) - 0.714170 * (v - 0.5);
68  double b = y + 1.77216 * (u - 0.5) - 0.000990 * (v - 0.5);
69  rgb->r(denormalize(rgb->rMin(), rgb->rMax(), r));
70  rgb->g(denormalize(rgb->gMin(), rgb->gMax(), g));
71  rgb->b(denormalize(rgb->bMin(), rgb->bMax(), b));
72  }
73 }
74 
virtual T rMax() const =0
T normalize(T lower, T upper, T value)
(value-lower)/(upper-lower)
Definition: utility.h:27
double uMin() const
Definition: YUV.hpp:41
double vMax() const
Definition: YUV.hpp:44
virtual T yMin() const =0
virtual T bMax() const =0
Definition: RGB.h:5
virtual T vMax() const =0
T r() const
Definition: RGB.hpp:14
T v() const
Definition: YUV.hpp:18
T denormalize(T lower, T upper, T _ratio)
(lower+_ratio*(upper-lower))
Definition: utility.h:35
virtual T bMin() const =0
Definition: YUV.h:7
void RGB_to_YUV(RGB< RGB_T > const &rgb, YUV< YUV_T > *yuv)
Definition: YUV.hpp:47
T y() const
Definition: YUV.hpp:16
double yMin() const
Definition: YUV.hpp:39
virtual T yMax() const =0
double vMin() const
Definition: YUV.hpp:43
YUVf()
Definition: YUV.hpp:35
void YUV_to_RGB(YUV< YUV_T > const &yuv, RGB< RGB_T > *rgb)
Definition: YUV.hpp:60
double uMax() const
Definition: YUV.hpp:42
double yMax() const
Definition: YUV.hpp:40
virtual T vMin() const =0
virtual T gMax() const =0
T u() const
Definition: YUV.hpp:17
virtual T rMin() const =0
T yuv(size_t i) const
Definition: YUV.hpp:19
T g() const
Definition: RGB.hpp:15
virtual T gMin() const =0
T b() const
Definition: RGB.hpp:16
T vuy(size_t i) const
Definition: YUV.hpp:22
~YUVf()
Definition: YUV.hpp:36
YUV()
Definition: YUV.hpp:6
virtual T uMax() const =0
virtual T uMin() const =0