Math Utilities
[Utilities]
Detailed Description
- See im_color.h
Functions | |
template<class T, class TU> | |
T | imZeroOrderDecimation (int width, int height, T *map, float xl, float yl, float box_width, float box_height, TU Dummy) |
template<class T, class TU> | |
T | imBilinearDecimation (int width, int height, T *map, float xl, float yl, float box_width, float box_height, TU Dummy) |
template<class T> | |
T | imZeroOrderInterpolation (int width, int height, T *map, float xl, float yl) |
template<class T> | |
T | imBilinearInterpolation (int width, int height, T *map, float xl, float yl) |
template<class T, class TU> | |
T | imBicubicInterpolation (int width, int height, T *map, float xl, float yl, TU Dummy) |
template<class T> | |
void | imMinMax (const T *map, int count, T &min, T &max) |
Function Documentation
|
Does Zero Order Decimation (Mean). 00046 { 00047 int x0,x1,y0,y1; 00048 (void)Dummy; 00049 00050 x0 = (int)floor(xl - box_width/2.0 - 0.5) + 1; 00051 y0 = (int)floor(yl - box_height/2.0 - 0.5) + 1; 00052 x1 = (int)floor(xl + box_width/2.0 - 0.5); 00053 y1 = (int)floor(yl + box_height/2.0 - 0.5); 00054 00055 if (x0 == x1) x1++; 00056 if (y0 == y1) y1++; 00057 00058 x0 = x0<0? 0: x0>width-1? width-1: x0; 00059 y0 = y0<0? 0: y0>height-1? height-1: y0; 00060 x1 = x1<0? 0: x1>width-1? width-1: x1; 00061 y1 = y1<0? 0: y1>height-1? height-1: y1; 00062 00063 TU Value; 00064 int Count = 0; 00065 00066 Value = 0; 00067 00068 for (int y = y0; y <= y1; y++) 00069 { 00070 for (int x = x0; x <= x1; x++) 00071 { 00072 Value += map[y*width+x]; 00073 Count++; 00074 } 00075 } 00076 00077 if (Count == 0) 00078 { 00079 Value = 0; 00080 return (T)Value; 00081 } 00082 00083 return (T)(Value/(float)Count); 00084 }
|
|
Does Bilinear Decimation. 00090 { 00091 int x0,x1,y0,y1; 00092 (void)Dummy; 00093 00094 x0 = (int)floor(xl - box_width/2.0 - 0.5) + 1; 00095 y0 = (int)floor(yl - box_height/2.0 - 0.5) + 1; 00096 x1 = (int)floor(xl + box_width/2.0 - 0.5); 00097 y1 = (int)floor(yl + box_height/2.0 - 0.5); 00098 00099 if (x0 == x1) x1++; 00100 if (y0 == y1) y1++; 00101 00102 x0 = x0<0? 0: x0>width-1? width-1: x0; 00103 y0 = y0<0? 0: y0>height-1? height-1: y0; 00104 x1 = x1<0? 0: x1>width-1? width-1: x1; 00105 y1 = y1<0? 0: y1>height-1? height-1: y1; 00106 00107 TU Value, LineValue; 00108 float LineNorm, Norm, dxr, dyr; 00109 00110 Value = 0; 00111 Norm = 0; 00112 00113 for (int y = y0; y <= y1; y++) 00114 { 00115 dyr = yl - (y+0.5f); 00116 if (dyr < 0) dyr *= -1; 00117 00118 LineValue = 0; 00119 LineNorm = 0; 00120 00121 for (int x = x0; x <= x1; x++) 00122 { 00123 dxr = xl - (x+0.5f); 00124 if (dxr < 0) dxr *= -1; 00125 00126 LineValue += map[y*width+x] * dxr; 00127 LineNorm += dxr; 00128 } 00129 00130 Value += LineValue * dyr; 00131 Norm += dyr * LineNorm; 00132 } 00133 00134 if (Norm == 0) 00135 { 00136 Value = 0; 00137 return (T)Value; 00138 } 00139 00140 return (T)(Value/Norm); 00141 }
|
|
Does Zero Order Interpolation (Nearest Neighborhood). 00147 { 00148 int x0 = (int)(xl-0.5f); 00149 int y0 = (int)(yl-0.5f); 00150 x0 = x0<0? 0: x0>width-1? width-1: x0; 00151 y0 = y0<0? 0: y0>height-1? height-1: y0; 00152 return map[y0*width + x0]; 00153 }
|
|
Does Bilinear Interpolation. 00159 { 00160 int x0 = (int)(xl-0.5f); 00161 int y0 = (int)(yl-0.5f); 00162 int x1 = x0+1; 00163 int y1 = y0+1; 00164 00165 float t = xl - (x0+0.5f); 00166 float u = yl - (y0+0.5f); 00167 00168 x0 = x0<0? 0: x0>width-1? width-1: x0; 00169 y0 = y0<0? 0: y0>height-1? height-1: y0; 00170 x1 = x1<0? 0: x1>width-1? width-1: x1; 00171 y1 = y1<0? 0: y1>height-1? height-1: y1; 00172 00173 T fll = map[y0*width + x0]; 00174 T fhl = map[y0*width + x1]; 00175 T flh = map[y1*width + x0]; 00176 T fhh = map[y1*width + x1]; 00177 00178 return (T)((fhh - flh - fhl + fll) * u * t + 00179 (fhl - fll) * t + 00180 (flh - fll) * u + 00181 fll); 00182 }
|
|
Does Bicubic Interpolation. 00188 { 00189 (void)Dummy; 00190 00191 int x0 = (int)(xl-0.5f); 00192 int y0 = (int)(yl-0.5f); 00193 int x1 = x0-1; 00194 int x2 = x0+2; 00195 int y1 = y0-1; 00196 int y2 = y0+2; 00197 00198 float t = xl - (x0+0.5f); 00199 float u = yl - (y0+0.5f); 00200 00201 x1 = x1<0? 0: x1>width-1? width-1: x1; 00202 y1 = y1<0? 0: y1>height-1? height-1: y1; 00203 x2 = x2<0? 0: x2>width-1? width-1: x2; 00204 y2 = y2<0? 0: y2>height-1? height-1: y2; 00205 00206 float CX[4], CY[4]; 00207 00208 // Optimize calculations 00209 { 00210 float x, x2, x3; 00211 00212 #define C0 (-x3 + 2.0f*x2 - x) 00213 #define C1 ( x3 - 2.0f*x2 + 1.0f) 00214 #define C2 (-x3 + x2 + x) 00215 #define C3 ( x3 - x2) 00216 00217 x = t; 00218 x2 = x*x; x3 = x2*x; 00219 CX[0] = C0; CX[1] = C1; CX[2] = C2; CX[3] = C3; 00220 00221 x = u; 00222 x2 = x*x; x3 = x2*x; 00223 CY[0] = C0; CY[1] = C1; CY[2] = C2; CY[3] = C3; 00224 } 00225 00226 #undef C0 00227 #undef C1 00228 #undef C2 00229 #undef C3 00230 00231 TU LineValue, Value; 00232 float LineNorm, Norm; 00233 00234 Value = 0; 00235 Norm = 0; 00236 00237 for (int y = y1; y <= y2; y++) 00238 { 00239 LineValue = 0; 00240 LineNorm = 0; 00241 00242 for (int x = x1; x <= x2; x++) 00243 { 00244 LineValue += map[y*width+x] * CX[x-x1]; 00245 LineNorm += CX[x-x1]; 00246 } 00247 00248 Value += LineValue * CY[y-y1]; 00249 Norm += CY[y-y1] * LineNorm; 00250 } 00251 00252 if (Norm == 0) 00253 { 00254 Value = 0; 00255 return (T)Value; 00256 } 00257 00258 Value = (Value/Norm); 00259 00260 int size = sizeof(T); 00261 if (size == 1) 00262 return (T)(Value<=0? 0: Value<=255? Value: 255); 00263 else 00264 return (T)(Value); 00265 }
|
|
Calculates minimum and maximum values. 00271 { 00272 min = *map++; 00273 max = min; 00274 for (int i = 1; i < count; i++) 00275 { 00276 T value = *map++; 00277 00278 if (value > max) 00279 max = value; 00280 else if (value < min) 00281 min = value; 00282 } 00283 }
|