summaryrefslogtreecommitdiff
path: root/html/en/representation.html
blob: 4c902cc4d14c2bc67c08e981eafd3bf5e9f5e5dc (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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
<html>

<head>
<meta http-equiv="Content-Language" content="en-us">
<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>Representation</title>
<link rel="stylesheet" type="text/css" href="../style.css">
</head>

<body>

<h1>Image Representation</h1>
<h3>Width and Height</h3>

  <p>In the IM library images are 2D matrices of pixels defining <b>width</b> and <b>height</b>. Stacks, Animations, 
  Videos and Volumes are represented as a sequence of individual images. </p>

<h3>Color Space</h3>

  <p>The pixels can have one of several <b>color spaces</b>: </p>
  <ul>
    <li><b>IM_RGB</b></li>
    <li><b>IM_MAP</b></li>
    <li><b>IM_GRAY</b></li>
    <li><b>IM_BINARY</b></li>
    <li><b>IM_CMYK</b></li>
    <li><b>IM_YCBCR</b></li>
    <li><b>IM_LAB</b></li>
    <li><b>IM_LUV</b></li>
    <li><b>IM_XYZ</b> .&nbsp;&nbsp; </li>
  </ul>
  <p><b>IM_MAP</b> is a subset of the <b>IM_RGB</b> color space. It can have a maximum of 256 colors. Each 
  value is an index into a RGB palette.</p>
  <p><b>IM_GRAY</b> usually means luma (nonlinear Luminance), but it can represent any other intensity value that 
  is not necessarily related to color.</p>
  <p><b>IM_BINARY</b> is a subset of the <b>IM_GRAY</b> color space, and it has only 2 colors black and 
  white. Each value can be 0 or 1. But for practical reasons we use one byte to store it.</p>
  <p>The other color spaces are standard CIE color spaces, except CMYK that does not have a clear definition without 
  other parameters to complement it.</p>

<h3>Data Type</h3>

  <p>There are several numeric representations for the color component, or several <b>data types</b>:</p>
  <ul>
    <li><b>IM_BYTE</b></li>
    <li><b>IM_USHORT</b></li>
    <li><b>IM_INT</b></li>
    <li><b>IM_FLOAT</b></li>
    <li><b>IM_CFLOAT</b>. </li>
  </ul>
  <p>There is no bit type, binary images use 1 byte (waist space but keep processing simple).</p>

<h3>Color Mode Flags</h3>

  <p>To avoid defining another image parameter we also use a parameter called <b>color_mode</b> that it is composed by 
  the <b>color_space</b> plus some <b>flags</b>, i.e. <b>color_mode = color_space + flags</b>. The flags are binary 
  combined with the color space, for example color_mode = IM_RGB | IM_XXX. And several flags can be combined in the same 
  color_mode. </p>
  <p>There are 3 flags:</p>
  <ul>
    <li><b>IM_ALPHA</b></li>
    <li><b>IM_PACKED</b></li>
    <li><b>IM_TOPDOWN</b></li>
  </ul>
  <p>When a flag is absent the opposite definition is assumed. For simplicity we define some macros that help handling 
  the color mode:</p>
  <ul>
    <li><b>imColorModeSpace</b></li>
    <li><b>imColorModeHasAlpha</b></li>
    <li><b>imColorModeIsPacked</b></li>
    <li><b>imColorModeIsTopDown</b></li>
  </ul>
  <h4>Color Components Packaging (<b>IM_PACKED or unpacked)</b></h4>
  
    <p>The number of components of the color space defines the depth of the image. The color components can be packed 
    sequentially in one plane (like rgbrgbrgb...) or separated in several planes (like rrr...ggg...bbb...). Packed color 
    components are normally used by graphics systems. We allow these two options because many users define their own 
    image structure that can have a packed or an separated organization. The following picture illustrates the 
    difference between the two options:</p>
  
  <p align="center"><img border="0" src="paking.gif" width="626" height="232"><br>
  <b>(flag not defined)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  IM_PACKED</b></p>
  <p align="center"><b>Separated and Packed RGB Components</b></p>
  <h4>Alpha Channel (<b>IM_ALPHA or no alpha</b>)</h4>
  
    <p>An extra component, the <b>alpha</b> channel, may be present. The number of components is then increased by one. 
    Its organization follows the rules of packed and unpacked components.</p>
  
  <h4>Orientation (<b>IM_TOPDOWN or bottom up)</b></h4>
  
    <p>Image orientation can be bottom up to top with the origin at the bottom left corner, or top down to bottom with 
    the origin at the top left corner. </p>
  
  <p align="center"><img border="0" src="topdown.gif" width="538" height="280"></p>
  <p align="center"><b>IM_TOPDOWN</b> <b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  (flag not defined)</b></p>
  <p align="center"><b>Top Down and Bottom Up Orientations</b></p>
  <h4>Examples</h4>
  
    <p><b>IM_RGB</b> | <b>IM_ALPHA</b> - rgb color space with an alpha channel, bottom up orientation and 
    separated components<br>
    <b>IM_GRAY</b> | <b>IM_TOPDOWN</b> - gray color space with no alpha channel and top down orientation<br>
    <b>IM_RGB</b> | <b>IM_ALPHA</b> | <b>IM_PACKED</b> - rgb color space with an alpha channel, bottom 
    up orientation and packed components</p>
  

<h3>Raw Data Buffer</h3>

  <p>So these four parameters define our raw image data: <b>width</b>, <b>height</b>, <b>color_mode</b> and <b>data_type</b>. 
  The raw data buffer is always byte aligned and each component is stored sequentially in the buffer following the 
  specified packing. </p>
  <p>For example, if a RGB image is 4x4 pixels it will have the following organization in memory:</p>
  
    <pre><b>RRRR</b>RRRR<b>RRRR</b>RRRR<b>GGGG</b>GGGG<b>GGGG</b>GGGG<b>BBBB</b>BBBB<b>BBBB</b>BBBB - for non packed components
0   1   2   3   0   1   2   3   0   1   2   3</pre>
    <pre><b>RGBRGBRGBRGB</b>RGBRGBRGBRGB<b>RGBRGBRGBRGB</b>RGBRGBRGBRGB - for packed components
0           1           2           3</pre>
  
  <p>In bold we visually marked some lines of data.</p>

<hr>
<h3>imImage</h3>

  <p>We could restrict the data organization by eliminating the extra flags, but several users requested these features 
  in the library. So we keep them but restricted to raw data buffers. </p>
  <p>For the high level image processing functions we created a structure called <b>imImage</b> that eliminates the 
  extra flags and assume <u>bottom up orientation</u> and <u>separated components</u>. Alpha channel is supported as an 
  extra component.</p>
  <p>The <b>imImage</b> structure is defined using four image parameters: <b>width</b>, <b>height</b>, <b>color_space</b> 
  and <b>data_type</b>. It is an open structure in C where you can access all the parameters. In addition to the 4 
  creation parameters there are many auxiliary parameters like <b>depth</b>, <b>count</b>, <b>line_size</b>, <b>
  plane_size</b> and <b>size</b>. </p>

<p>
As the library is designed to work with such a wide range of image data 
organization, there are no general purpose functions for getting/setting 
individual pixels, as they would be too complicated and inefficient. Rather, you 
should use the components of the imImage structure to access image pixels in the 
most efficient way.
</p>

<h3>Bitmaps</h3>

  <div align="left">
    <p align="left">An important subset of images is what we call a <b>Bitmap</b> image. It is an image that can be 
    displayed in graphics devices usually using a graphics library like CD or 
	OpenGL. For Bitmap images the color space must be 
    <b>IM_RGB</b>, <b>IM_MAP</b>,
    <b>IM_GRAY</b> or <b>IM_BINARY</b>, and the data type must be <b>IM_BYTE</b>.</div>
  
</body>

</html>