Changeset 2204 for trunk/psLib/src/image/psImageConvolve.c
- Timestamp:
- Oct 26, 2004, 2:57:34 PM (22 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/image/psImageConvolve.c (modified) (17 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/image/psImageConvolve.c
r1983 r2204 5 5 * @author Robert DeSonia, MHPCC 6 6 * 7 * @version $Revision: 1. 6$ $Name: not supported by cvs2svn $8 * @date $Date: 2004-10- 06 21:31:30$7 * @version $Revision: 1.7 $ $Name: not supported by cvs2svn $ 8 * @date $Date: 2004-10-27 00:57:31 $ 9 9 * 10 10 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 28 28 static void freeKernel(psKernel* ptr); 29 29 30 psKernel* psKernelAlloc( int xMin, int xMax, int yMin, intyMax)30 psKernel* psKernelAlloc(psS32 xMin, psS32 xMax, psS32 yMin, psS32 yMax) 31 31 { 32 32 psKernel* result; 33 intnumRows;34 intnumCols;33 psS32 numRows; 34 psS32 numCols; 35 35 36 36 // following is explicitly spelled out in the SDRS as a requirement … … 40 40 yMin, yMax); 41 41 42 inttemp = yMin;42 psS32 temp = yMin; 43 43 yMin = yMax; 44 44 yMax = temp; … … 51 51 xMin, xMax); 52 52 53 inttemp = xMin;53 psS32 temp = xMin; 54 54 xMin = xMax; 55 55 xMax = temp; … … 70 70 psKernelType** kernelRows = result->p_kernelRows; 71 71 psKernelType** imageRows = result->image->data.PS_TYPE_KERNEL_DATA; 72 for ( inti = 0; i < numRows; i++) {72 for (psS32 i = 0; i < numRows; i++) { 73 73 kernelRows[i] = imageRows[i] - xMin; 74 74 } … … 91 91 const psVector* xShifts, 92 92 const psVector* yShifts, 93 bool relative)93 psBool relative) 94 94 { 95 intx = 0;96 inty = 0;97 intt = 0;98 intdeltaT;99 intoldX;100 intoldY;101 intxMin = 0;102 intxMax = 0;103 intyMin = 0;104 intyMax = 0;105 intlength = 0;95 psS32 x = 0; 96 psS32 y = 0; 97 psS32 t = 0; 98 psS32 deltaT; 99 psS32 oldX; 100 psS32 oldY; 101 psS32 xMin = 0; 102 psS32 xMax = 0; 103 psS32 yMin = 0; 104 psS32 yMax = 0; 105 psS32 length = 0; 106 106 psKernelType normalizeTime = 1.0; // fraction of total time for each shift clock 107 107 psKernel* result = NULL; … … 153 153 y = 0; \ 154 154 t = 0; \ 155 for ( intlcv = 0; lcv < length; lcv++) { \155 for (psS32 lcv = 0; lcv < length; lcv++) { \ 156 156 if (relative) { \ 157 157 x += xShiftData[lcv]; \ … … 181 181 y = 0; \ 182 182 t = 0; \ 183 for ( inti = 0; i < length; i++) { \183 for (psS32 i = 0; i < length; i++) { \ 184 184 deltaT = t; \ 185 185 oldX = x; \ … … 228 228 } 229 229 230 psImage* psImageConvolve(psImage* out, const psImage* in, const psKernel* kernel, bool direct)230 psImage* psImageConvolve(psImage* out, const psImage* in, const psKernel* kernel, psBool direct) 231 231 { 232 232 if (in == NULL) { … … 242 242 return NULL; 243 243 } 244 intxMin = kernel->xMin;245 intxMax = kernel->xMax;246 intyMin = kernel->yMin;247 intyMax = kernel->yMax;244 psS32 xMin = kernel->xMin; 245 psS32 xMax = kernel->xMax; 246 psS32 yMin = kernel->yMin; 247 psS32 yMax = kernel->yMax; 248 248 psKernelType** kData = kernel->kernel; 249 249 250 250 // make the output image to the proper size and type 251 intnumRows = in->numRows;252 intnumCols = in->numCols;251 psS32 numRows = in->numRows; 252 psS32 numCols = in->numCols; 253 253 254 254 … … 261 261 ps##TYPE** inData = in->data.TYPE; \ 262 262 out = psImageRecycle(out, numCols, numRows, PS_TYPE_##TYPE); \ 263 for ( introw=0;row<numRows;row++) { \263 for (psS32 row=0;row<numRows;row++) { \ 264 264 ps##TYPE* outRow = out->data.TYPE[row]; \ 265 for ( intcol=0;col<numCols;col++) { \265 for (psS32 col=0;col<numCols;col++) { \ 266 266 ps##TYPE pixel = 0.0; \ 267 for ( intkRow = yMin; kRow < yMax; kRow++) { \267 for (psS32 kRow = yMin; kRow < yMax; kRow++) { \ 268 268 if (row-kRow >= 0 && row-kRow < numRows) { \ 269 for ( intkCol = xMin; kCol < xMax; kCol++) { \269 for (psS32 kCol = xMin; kCol < xMax; kCol++) { \ 270 270 if (col-kCol >= 0 && col-kCol < numCols) { \ 271 271 pixel += kData[kRow][kCol] * inData[row-kRow][col-kCol]; \ … … 310 310 } else { 311 311 // fourier convolution 312 intpaddedCols = numCols+2*FOURIER_PADDING;313 intpaddedRows = numRows+2*FOURIER_PADDING;312 psS32 paddedCols = numCols+2*FOURIER_PADDING; 313 psS32 paddedRows = numRows+2*FOURIER_PADDING; 314 314 315 315 // check to see if kernel is smaller, otherwise padding it up will fail. 316 intkRows = kernel->image->numRows;317 intkCols = kernel->image->numCols;316 psS32 kRows = kernel->image->numRows; 317 psS32 kCols = kernel->image->numCols; 318 318 if (kRows >= numRows || kCols >= numCols) { 319 319 psErrorMsg(PS_ERRORNAME_DOMAIN "psImageConvolve", … … 328 328 // pad the image 329 329 psImage* paddedImage = psImageAlloc(paddedCols,paddedRows,in->type.type); 330 intelementSize = PSELEMTYPE_SIZEOF(in->type.type);330 psS32 elementSize = PSELEMTYPE_SIZEOF(in->type.type); 331 331 332 332 // zero out padded area on top and bottom … … 335 335 336 336 // fill in the image-containing rows. 337 intsidePaddingSize = FOURIER_PADDING*elementSize;338 intimageRowSize = numCols*elementSize;337 psS32 sidePaddingSize = FOURIER_PADDING*elementSize; 338 psS32 imageRowSize = numCols*elementSize; 339 339 psU8* paddedData = paddedImage->data.U8[FOURIER_PADDING]; 340 for ( introw=0;row<numRows;row++) {340 for (psS32 row=0;row<numRows;row++) { 341 341 // zero out padded area on left edge. 342 342 memset(paddedData,0,sidePaddingSize); … … 354 354 psImage* paddedKernel = psImageAlloc(paddedCols,paddedRows,PS_TYPE_KERNEL); 355 355 memset(paddedKernel->data.U8[0],0,sizeof(psKernelType)*numCols*numRows); // zero-out image 356 intyMax = kernel->yMax;357 intxMax = kernel->xMax;358 for ( introw = kernel->yMin; row <= yMax;row++) {359 intpadRow = row;356 psS32 yMax = kernel->yMax; 357 psS32 xMax = kernel->xMax; 358 for (psS32 row = kernel->yMin; row <= yMax;row++) { 359 psS32 padRow = row; 360 360 if (padRow < 0) { 361 361 padRow += paddedRows; … … 363 363 psKernelType* padData = paddedKernel->data.PS_TYPE_KERNEL_DATA[padRow]; 364 364 psKernelType* kernelRow = kernel->kernel[row]; 365 for ( intcol = kernel->xMin; col <= xMax; col++) {365 for (psS32 col = kernel->xMin; col <= xMax; col++) { 366 366 if (col < 0) { 367 367 padData[col+paddedCols] = kernelRow[col]; … … 418 418 out = psImageRecycle(out,numCols,numRows,PS_TYPE_F32); 419 419 float factor = 1.0f/numCols/numRows; 420 for ( introw = 0; row < numRows; row++) {420 for (psS32 row = 0; row < numRows; row++) { 421 421 psF32* outRow = out->data.F32[row]; 422 422 psC32* resultRow = complexOutSansPad->data.C32[row]; 423 for ( intcol = 0; col < numCols; col++) {423 for (psS32 col = 0; col < numCols; col++) { 424 424 outRow[col] = crealf(resultRow[col])*factor; 425 425 }
Note:
See TracChangeset
for help on using the changeset viewer.
