00001 #ifndef __IMAGE_H__
00002 #define __IMAGE_H__
00003
00004 #include <stdint.h>
00005 #include <stdlib.h>
00006 #include <stdio.h>
00007
00008 #include "stm_export.h"
00009
00010
00011 extern "C" {
00012
00013 int32_t STM_EXPORT constrain_reflect(int32_t x, uint32_t extent);
00014 int32_t STM_EXPORT constrain_wrap(int32_t x, uint32_t extent);
00015
00016 }
00017
00018 namespace spectral
00019 {
00020
00022 template <typename T>
00023 class image
00024 {
00025 public:
00026 image(uint32_t width,
00027 uint32_t height,
00028 uint32_t channels = 1,
00029 const T *buf = NULL)
00030 : m_buffer(NULL)
00031 , m_width(width)
00032 , m_height(height)
00033 , m_channels(channels)
00034 {
00035 uint32_t size = width * height * channels;
00036
00037 if(size)
00038 {
00039 m_buffer = new T[size];
00040
00041 if(buf && m_buffer)
00042 {
00043 for(uint32_t i=0;i<size;i++)
00044 {
00045 m_buffer[i] = buf[i];
00046 }
00047 }
00048 }
00049 }
00050
00051 virtual ~image()
00052 {
00053 if(m_buffer)
00054 {
00055 delete [] m_buffer;
00056 }
00057 }
00058
00060 size_t get_index(uint32_t x, uint32_t y) const
00061 {
00062 if((x < m_width) && (y < m_height))
00063 {
00064 uint32_t idx = x + (y * m_width);
00065 return (size_t)(idx * m_channels);
00066 }
00067 return (size_t)(-1);
00068 }
00069
00071 const T *get_pixel(uint32_t x, uint32_t y) const
00072 {
00073 T *result = (T *)NULL;
00074 size_t index = get_index(x, y);
00075
00076 if(m_buffer)
00077 {
00078 result = &(m_buffer[index]);
00079 }
00080
00081 return result;
00082 }
00083
00086 const T *get_constrained_pixel(uint32_t x, uint32_t y,
00087 bool wrap_x = false,
00088 bool wrap_y = false) const
00089 {
00090 int xx = (int)x;
00091 int yy = (int)y;
00092
00093 if(wrap_x)
00094 {
00095 xx = constrain_wrap(xx, m_width);
00096 }
00097 else
00098 {
00099 xx = constrain_reflect(xx, m_width);
00100 }
00101 if(wrap_y)
00102 {
00103 yy = constrain_wrap(yy, m_height);
00104 }
00105 else
00106 {
00107 yy = constrain_reflect(yy, m_height);
00108 }
00109
00110 return get_pixel(xx, yy);
00111 }
00112
00114 T* get_buffer(void) const {return m_buffer;}
00115
00117 uint32_t get_width(void) const {return m_width;}
00118
00120 uint32_t get_height(void) const {return m_height;}
00121
00123 uint32_t get_channels(void) const {return m_channels;}
00124
00126 void set_pixel(uint32_t x, uint32_t y, const T *pixel)
00127 {
00128 size_t index = get_index(x, y);
00129 if(pixel && m_buffer && (index < (m_width * m_height * m_channels)))
00130 {
00131 for(size_t i=0;i<(size_t)m_channels;i++)
00132 {
00133 m_buffer[i + index] = pixel[i];
00134 }
00135 }
00136 }
00137 private:
00138
00139 T *m_buffer;
00140 uint32_t m_width, m_height, m_channels;
00141 };
00142
00143
00144 class STM_EXPORT Image : public image<float>
00145 {
00146 public:
00147 Image(uint32_t width, uint32_t height, uint32_t cs, float *buffer = NULL);
00148 Image(const Image &);
00149 virtual ~Image();
00150
00152 uint32_t get_colour_space(void) const;
00153
00155 Image *CreateThumbnail(uint32_t width, uint32_t height) const;
00156
00158 Image *CreateTile(int32_t x, int32_t y,
00159 uint32_t width, uint32_t height,
00160 bool wrap_x, bool wrap_y) const;
00161
00163 Image *Expand(uint32_t x_border, uint32_t y_border,
00164 bool wrap_x, bool wrap_y) const;
00165
00167 Image *Contract(uint32_t x_border, uint32_t y_border) const;
00168
00169 private:
00170 uint32_t m_cs;
00171 };
00172
00174 class STM_EXPORT IntegralHistogram : public image<uint32_t>
00175 {
00176 public:
00177 IntegralHistogram(uint32_t bins, const Image &img,
00178 uint32_t x0, uint32_t y0,
00179 uint32_t width, uint32_t height,
00180 uint32_t(*pixel_to_bin)(uint32_t,
00181 uint32_t,
00182 const Image *,
00183 void *),
00184 void *data = NULL);
00185
00186 IntegralHistogram(uint32_t bins, const Image &img,
00187 uint32_t(*pixel_to_bin)(uint32_t,
00188 uint32_t,
00189 const Image *,
00190 void *),
00191 void *data = NULL);
00192
00193 virtual ~IntegralHistogram();
00194
00196 void GetHistogram(uint32_t x1, uint32_t y1,
00197 uint32_t x2, uint32_t y2,
00198 uint32_t *result) const;
00199 protected:
00200
00201 void
00202 BuildHistogram(uint32_t bins, const Image &img,
00203 uint32_t x0, uint32_t y0,
00204 uint32_t width, uint32_t height,
00205 uint32_t(*pixel_to_bin)(uint32_t,
00206 uint32_t,
00207 const Image *,
00208 void *),
00209 void *data = NULL);
00210 };
00211
00212 }
00213
00214 #endif
00215