summaryrefslogtreecommitdiff
path: root/2005/i/robert/src/ovision/see/convertImg.cc
blob: 9bc87eaedca5678cdf41757c9bfb24db76fc9f33 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include "convertImg.hh"

#include <math.h>

/// Renvoie le minimum entre 2 nombres
inline unsigned char min (unsigned char a, unsigned char b) 
{
    if (a<b) return a;
    else return b;
}

/// Convertit un tableau de donnees RGB en YUV
void 
ConvertImg::RGBtoYUV (Img &img) 
{
    unsigned char r,g,b;
    // Parcours du tableau et conversion des valeurs RGB en YUV
    for (unsigned long i=0; i<img.nbPixels_; i++) 
      {
	r = img.tabData_[i*3];
	g = img.tabData_[i*3+1];
	b = img.tabData_[i*3+2];
	img.tabData_[i*3] = (unsigned char)(0.299*r + 0.587*g + 0.114*b); // Y
	img.tabData_[i*3+1] = (unsigned char)(0-0.147*r - 0.289*g + 0.437*b + 0.5); // U
	img.tabData_[i*3+2] = (unsigned char)(00.615*r - 0.515*g - 0.100*b + 0.5); // V
      }
    img.colorMode_ = Image::yuv;
}

/// Convertit un tableau de donnees RGB en YUV
void
ConvertImg::RGBtoHSI (Img &img)
{
    unsigned char r,g,b;
    // Parcours du tableau et conversion des valeurs RGB en HSI
    for (unsigned long i=0; i<img.nbPixels_; i++) 
      {
	r = img.tabData_[i*3];
	g = img.tabData_[i*3+1];
	b = img.tabData_[i*3+2];
	img.tabData_[i*3] = (unsigned char)(acos((r-0.5f*g-0.5f*b)/(sqrt(1.0f*(r-g)*(r-g)+(r-b)*(g-b))))); // H
	img.tabData_[i*3+1] = (unsigned char)(1-min(min(r,g),b)); // S
	img.tabData_[i*3+2] = (unsigned char)(0.33f*(r+g+b)); // I
      }
    img.colorMode_ = Image::hsi;
}

/// Convertit un tableau de donnees YUV en RGB
void 
ConvertImg::YUVtoRGB (Img &img)
{
    unsigned char y,u,v;
    // Parcours du tableau et conversion des valeurs YUV en RGB
    for (unsigned long i=0; i<img.nbPixels_; i++) {
	y = img.tabData_[i*3];
	u = img.tabData_[i*3+1];
	v = img.tabData_[i*3+2];
	img.tabData_[i*3] = (unsigned char)(y + (1.4075 * (v - 128)));
        img.tabData_[i*3+1] = (unsigned char)(y + ((0.3455 * (u - 128)) - (0.7169 * (v - 128))));
	img.tabData_[i*3+2] = (unsigned char)(y + (1.7790 * (u - 128)));
    }
    img.colorMode_ = Image::rgb;
}

/// Convertit une image de BGR en RGB
void
ConvertImg::BGRtoRGB (Img &img)
{
    unsigned char b;
    unsigned char *tab;
    tab = img.tabData_;
    // Parcours du tableau et conversion des valeurs BGR en RGB 
    for (unsigned long i=0; i<img.nbPixels_; i++) 
      {
	b = *tab;
	*tab = *(++(++tab));
	*tab = b;
	++tab;
      }
    img.colorMode_ = Image::rgb;
}

/// Convertit une image en RGB
void
ConvertImg::ConvertToRGB (Img &img)
{
    switch (img.colorMode_)
      {
      case Image::bgr: 
	BGRtoRGB (img);
	break;
      case Image::yuv:
	YUVtoRGB (img);
	break;
      default:
	break;
      }
}