Changeset 1940
- Timestamp:
- Oct 1, 2004, 10:58:32 AM (22 years ago)
- Location:
- trunk/psLib
- Files:
-
- 3 edited
-
src/image/psImageConvolve.c (modified) (7 diffs)
-
src/imageops/psImageConvolve.c (modified) (7 diffs)
-
test/image/tst_psImageConvolve.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/image/psImageConvolve.c
r1936 r1940 5 5 * @author Robert DeSonia, MHPCC 6 6 * 7 * @version $Revision: 1. 4$ $Name: not supported by cvs2svn $8 * @date $Date: 2004- 09-30 21:01:09$7 * @version $Revision: 1.5 $ $Name: not supported by cvs2svn $ 8 * @date $Date: 2004-10-01 20:58:32 $ 9 9 * 10 10 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 64 64 result->yMax = yMax; 65 65 result->image = psImageAlloc(numCols,numRows,PS_TYPE_KERNEL); 66 memset(result->image->rawDataBuffer,0,numCols*numRows*PSELEMTYPE_SIZEOF(PS_TYPE_KERNEL)); 66 67 result->p_kernelRows = psAlloc(sizeof(psKernelType*)*numRows); 67 68 … … 94 95 int y = 0; 95 96 int t = 0; 96 int deltaT = 0; 97 int deltaT; 98 int oldX; 99 int oldY; 97 100 int xMin = 0; 98 101 int xMax = 0; … … 105 108 106 109 // got non-NULL vectors? 107 if ( xShifts == NULL || yShifts == NULL) {110 if (tShifts == NULL || xShifts == NULL || yShifts == NULL) { 108 111 psErrorMsg(PS_ERRORNAME_DOMAIN "psKernelGenerate", 109 112 PS_ERR_BAD_PARAMETER_NULL, true, … … 146 149 ps##TYPE *xShiftData = xShifts->data.TYPE; \ 147 150 ps##TYPE *yShiftData = yShifts->data.TYPE; \ 151 x = 0; \ 152 y = 0; \ 153 t = 0; \ 148 154 for (int lcv = 0; lcv < length; lcv++) { \ 149 155 if (relative) { \ 150 156 x += xShiftData[lcv]; \ 151 157 y += yShiftData[lcv]; \ 158 t += tShiftData[lcv]; \ 152 159 } else { \ 153 160 x = xShiftData[lcv]; \ 154 161 y = yShiftData[lcv]; \ 162 t = tShiftData[lcv]; \ 155 163 } \ 156 164 if (x < xMin) { \ … … 168 176 kernel = result->kernel; \ 169 177 \ 170 x = xShiftData[0]; \171 y = yShiftData[0]; \172 t = tShiftData[0]; \173 normalizeTime = 1.0 / (psKernelType)(tShiftData[length-1]-t); \174 for (int i = 1; i < length; i++) { \178 normalizeTime = 1.0 / (psKernelType)(t); \ 179 x = 0; \ 180 y = 0; \ 181 t = 0; \ 182 for (int i = 0; i < length; i++) { \ 175 183 deltaT = t; \ 184 oldX = x; \ 185 oldY = y; \ 176 186 if (relative) { \ 177 187 t += tShiftData[i]; \ … … 185 195 deltaT = t - deltaT; \ 186 196 \ 187 kernel[ y][x] += deltaT * normalizeTime; \197 kernel[oldY][oldX] += deltaT * normalizeTime; \ 188 198 } \ 199 break; \ 189 200 } 190 201 -
trunk/psLib/src/imageops/psImageConvolve.c
r1936 r1940 5 5 * @author Robert DeSonia, MHPCC 6 6 * 7 * @version $Revision: 1. 4$ $Name: not supported by cvs2svn $8 * @date $Date: 2004- 09-30 21:01:09$7 * @version $Revision: 1.5 $ $Name: not supported by cvs2svn $ 8 * @date $Date: 2004-10-01 20:58:32 $ 9 9 * 10 10 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 64 64 result->yMax = yMax; 65 65 result->image = psImageAlloc(numCols,numRows,PS_TYPE_KERNEL); 66 memset(result->image->rawDataBuffer,0,numCols*numRows*PSELEMTYPE_SIZEOF(PS_TYPE_KERNEL)); 66 67 result->p_kernelRows = psAlloc(sizeof(psKernelType*)*numRows); 67 68 … … 94 95 int y = 0; 95 96 int t = 0; 96 int deltaT = 0; 97 int deltaT; 98 int oldX; 99 int oldY; 97 100 int xMin = 0; 98 101 int xMax = 0; … … 105 108 106 109 // got non-NULL vectors? 107 if ( xShifts == NULL || yShifts == NULL) {110 if (tShifts == NULL || xShifts == NULL || yShifts == NULL) { 108 111 psErrorMsg(PS_ERRORNAME_DOMAIN "psKernelGenerate", 109 112 PS_ERR_BAD_PARAMETER_NULL, true, … … 146 149 ps##TYPE *xShiftData = xShifts->data.TYPE; \ 147 150 ps##TYPE *yShiftData = yShifts->data.TYPE; \ 151 x = 0; \ 152 y = 0; \ 153 t = 0; \ 148 154 for (int lcv = 0; lcv < length; lcv++) { \ 149 155 if (relative) { \ 150 156 x += xShiftData[lcv]; \ 151 157 y += yShiftData[lcv]; \ 158 t += tShiftData[lcv]; \ 152 159 } else { \ 153 160 x = xShiftData[lcv]; \ 154 161 y = yShiftData[lcv]; \ 162 t = tShiftData[lcv]; \ 155 163 } \ 156 164 if (x < xMin) { \ … … 168 176 kernel = result->kernel; \ 169 177 \ 170 x = xShiftData[0]; \171 y = yShiftData[0]; \172 t = tShiftData[0]; \173 normalizeTime = 1.0 / (psKernelType)(tShiftData[length-1]-t); \174 for (int i = 1; i < length; i++) { \178 normalizeTime = 1.0 / (psKernelType)(t); \ 179 x = 0; \ 180 y = 0; \ 181 t = 0; \ 182 for (int i = 0; i < length; i++) { \ 175 183 deltaT = t; \ 184 oldX = x; \ 185 oldY = y; \ 176 186 if (relative) { \ 177 187 t += tShiftData[i]; \ … … 185 195 deltaT = t - deltaT; \ 186 196 \ 187 kernel[ y][x] += deltaT * normalizeTime; \197 kernel[oldY][oldX] += deltaT * normalizeTime; \ 188 198 } \ 199 break; \ 189 200 } 190 201 -
trunk/psLib/test/image/tst_psImageConvolve.c
r1937 r1940 5 5 * @author Robert DeSonia, MHPCC 6 6 * 7 * @version $Revision: 1. 2$ $Name: not supported by cvs2svn $8 * @date $Date: 2004- 09-30 21:04:15$7 * @version $Revision: 1.3 $ $Name: not supported by cvs2svn $ 8 * @date $Date: 2004-10-01 20:58:32 $ 9 9 * 10 10 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 21 21 22 22 static int testKernelAlloc(void); 23 static int testKernelGenerate(void); 23 24 24 25 testDescription tests[] = { 25 26 {testKernelAlloc,731,"psKernelAlloc",0,false}, 27 {testKernelGenerate,732,"psKernelGenerate",0,false}, 26 28 {NULL} 27 29 }; … … 110 112 return 0; 111 113 } 114 115 static int testKernelGenerate(void) 116 { 117 int size = 4; 118 int t[] = { 1, 2, 8, 10 }; 119 int x[] = { 0, 1, 0, -1 }; 120 int y[] = { 2, 1, -1, -2 }; 121 psKernelType sum; 122 123 psVector* xVec = psVectorAlloc(size,PS_TYPE_U32); 124 psVector* yVec = psVectorAlloc(size,PS_TYPE_U32); 125 psVector* tVec = psVectorAlloc(size,PS_TYPE_U32); 126 127 for (int i = 0; i < size; i++) { 128 xVec->data.U32[i] = x[i]; 129 yVec->data.U32[i] = y[i]; 130 tVec->data.U32[i] = t[i]; 131 } 132 133 psKernel* result = psKernelGenerate(tVec, xVec, yVec, false); 134 135 if (result == NULL) { 136 psError(__func__,"psKernelGenerate returned NULL."); 137 return 1; 138 } 139 140 if (result->xMin != -1 || result->xMax != 1 || 141 result->yMin != -2 || result->yMax != 2) { 142 psError(__func__,"psKernelGenerate result had a range of [%d:%d,%d:%d]. Suppose to be [0:1,1:2].", 143 result->xMin, result->xMax, result->yMin, result->yMax); 144 return 2; 145 } 146 147 sum = 0.0; 148 for (int y = result->yMin; y <= result->yMax; y++) { 149 for (int x = result->xMin; x <= result->xMax; x++) { 150 sum += result->kernel[y][x]; 151 } 152 } 153 if (fabsf(1.0 - sum) > FLT_EPSILON) { 154 psError(__func__,"psKernelGenerate result is not normalized (sum=%g).", 155 sum); 156 157 return 3; 158 159 } 160 161 if (fabsf(result->kernel[2][0] - 1.0/10.0) > FLT_EPSILON || 162 fabsf(result->kernel[ 1][ 1] - 6.0/10.0) > FLT_EPSILON || 163 fabsf(result->kernel[ 0][ 0] - 1.0/10.0) > FLT_EPSILON || 164 fabsf(result->kernel[-1][ 0] - 2.0/10.0) > FLT_EPSILON || 165 fabsf(result->kernel[-2][-1] - 0.0/10.0) > FLT_EPSILON) { 166 psError(__func__,"psKernelGenerate result values, %g,%g;%g,%g, are wrong. Suppose to be 2,6;1,0.", 167 result->kernel[-1][0], result->kernel[1][1], 168 result->kernel[2][0], result->kernel[-2][-1]); 169 170 return 4; 171 } 172 173 psFree(result); 174 psFree(xVec); 175 psFree(yVec); 176 psFree(tVec); 177 178 xVec = psVectorAlloc(size,PS_TYPE_S16); 179 yVec = psVectorAlloc(size,PS_TYPE_S16); 180 tVec = psVectorAlloc(size,PS_TYPE_S16); 181 182 for (int i = 0; i < size; i++) { 183 xVec->data.S16[i] = x[i]; 184 yVec->data.S16[i] = y[i]; 185 tVec->data.S16[i] = t[i]; 186 } 187 188 result = psKernelGenerate(tVec, xVec, yVec, true); 189 190 if (result == NULL) { 191 psError(__func__,"psKernelGenerate returned NULL."); 192 return 5; 193 } 194 195 if (result->xMin != 0 || result->xMax != 1 || 196 result->yMin != 0 || result->yMax != 3) { 197 psError(__func__,"psKernelGenerate result had a range of [%d:%d,%d:%d]. Suppose to be [0:1,1:2].", 198 result->xMin, result->xMax, result->yMin, result->yMax); 199 return 6; 200 } 201 202 sum = 0.0; 203 for (int y = result->yMin; y <= result->yMax; y++) { 204 for (int x = result->xMin; x <= result->xMax; x++) { 205 sum += result->kernel[y][x]; 206 } 207 } 208 if (fabsf(1.0 - sum) > FLT_EPSILON) { 209 psError(__func__,"psKernelGenerate result is not normalized (sum=%g).", 210 sum); 211 212 return 7; 213 214 } 215 216 if (fabsf(result->kernel[0][0] - 1.0/21.0) > FLT_EPSILON || 217 fabsf(result->kernel[2][0] - 2.0/21.0) > FLT_EPSILON || 218 fabsf(result->kernel[3][1] - 8.0/21.0) > FLT_EPSILON || 219 fabsf(result->kernel[2][1] - 10.0/21.0) > FLT_EPSILON) { 220 psError(__func__,"psKernelGenerate result values, %g,%g;%g,%g, are wrong. Suppose to be 2,6;1,0.", 221 result->kernel[1][0], result->kernel[1][1], 222 result->kernel[2][0], result->kernel[2][1]); 223 224 return 8; 225 } 226 227 psFree(result); 228 psFree(xVec); 229 psFree(yVec); 230 psFree(tVec); 231 232 xVec = psVectorAlloc(size,PS_TYPE_F32); 233 yVec = psVectorAlloc(size,PS_TYPE_F32); 234 tVec = psVectorAlloc(size,PS_TYPE_F32); 235 236 for (int i = 0; i < size; i++) { 237 xVec->data.F32[i] = x[i]+0.1; 238 yVec->data.F32[i] = y[i]+0.2; 239 tVec->data.F32[i] = t[i]+0.3; 240 } 241 242 tVec->n--; // decrease size by one to make vectors unequal in length. 243 psLogMsg(__func__,PS_LOG_INFO, "Following should be a warning - not automatically tested."); 244 result = psKernelGenerate(tVec, xVec, yVec, false); 245 if (result == NULL) { 246 psError(__func__,"psKernelGenerate returned NULL."); 247 return 9; 248 } 249 250 // make sure last sample is not used 251 if (fabsf(result->kernel[2][0] - 1.0/8.0) > FLT_EPSILON || 252 fabsf(result->kernel[ 1][ 1] - 6.0/8.0) > FLT_EPSILON || 253 fabsf(result->kernel[ 0][ 0] - 1.0/8.0) > FLT_EPSILON) { 254 psError(__func__,"psKernelGenerate result values wrong for truncated time vector."); 255 256 return 10; 257 } 258 259 psFree(result); 260 261 psLogMsg(__func__,PS_LOG_INFO, "Following should be a error (time vector NULL)."); 262 result = psKernelGenerate(NULL, xVec, yVec, true); 263 if (result != NULL) { 264 psError(__func__,"psKernelGenerate returned a kernel with no time vector."); 265 return 11; 266 } 267 268 psLogMsg(__func__,PS_LOG_INFO, "Following should be a error (x vector NULL)."); 269 result = psKernelGenerate(tVec, NULL, yVec, true); 270 if (result != NULL) { 271 psError(__func__,"psKernelGenerate returned a kernel with no x vector."); 272 return 11; 273 } 274 275 psLogMsg(__func__,PS_LOG_INFO, "Following should be a error (y vector NULL)."); 276 result = psKernelGenerate(tVec, xVec, NULL, true); 277 if (result != NULL) { 278 psError(__func__,"psKernelGenerate returned a kernel with no y vector."); 279 return 11; 280 } 281 282 psFree(xVec); 283 psFree(yVec); 284 psFree(tVec); 285 psFree(result); 286 287 return 0; 288 }
Note:
See TracChangeset
for help on using the changeset viewer.
