Changeset 3702
- Timestamp:
- Apr 14, 2005, 2:12:09 PM (21 years ago)
- Location:
- trunk/psLib
- Files:
-
- 10 edited
-
src/fft/psImageFFT.c (modified) (3 diffs)
-
src/image/psImage.c (modified) (3 diffs)
-
src/image/psImage.h (modified) (2 diffs)
-
src/image/psImageConvolve.c (modified) (6 diffs)
-
src/image/psImageFFT.c (modified) (3 diffs)
-
src/imageops/psImageConvolve.c (modified) (6 diffs)
-
src/mathtypes/psImage.c (modified) (3 diffs)
-
src/mathtypes/psImage.h (modified) (2 diffs)
-
test/image/tst_psImageConvolve.c (modified) (15 diffs)
-
test/image/tst_psImageFFT.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/fft/psImageFFT.c
r3671 r3702 5 5 * @author Robert DeSonia, MHPCC 6 6 * 7 * @version $Revision: 1.1 0$ $Name: not supported by cvs2svn $8 * @date $Date: 2005-04- 06 01:12:58 $7 * @version $Revision: 1.11 $ $Name: not supported by cvs2svn $ 8 * @date $Date: 2005-04-15 00:12:08 $ 9 9 * 10 10 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 74 74 // n.b. FFTW can perform a in-place transform at the same rate or faster than out-of-place. 75 75 psS32 sign = ((direction & PS_FFT_FORWARD) != 0) ? FFTW_FORWARD : FFTW_BACKWARD; 76 out = psImageCopy(out, in, PS_TYPE_C32); 77 plan = fftwf_plan_dft_2d(numCols, numRows, 78 out->data.C32[0], 79 out->data.C32[0], 76 77 fftwf_complex* outBuffer = fftwf_malloc(numRows*numCols*sizeof(fftwf_complex)); 78 p_psImageCopyToRawBuffer(outBuffer, in, PS_TYPE_C32); 79 80 plan = fftwf_plan_dft_2d(numRows, numCols, 81 outBuffer, 82 outBuffer, 80 83 sign, 81 84 PS_FFTW_PLAN_RIGOR); … … 101 104 // becomes an issue, the use of fftwf_plan_dft_r2c should be considered 102 105 // as well as fftwf_plan_dft_c2r. 103 psImage* realOut = psImageCopy(NULL,out,PS_TYPE_F32); 104 psFree(out); 105 out = realOut; 106 } 106 out = psImageRecycle(out,numCols,numRows,PS_TYPE_F32); 107 int index = 0; 108 for (int row=0; row < numRows; row++) { 109 psF32* outRow = out->data.F32[row]; 110 for (int col=0; col < numCols; col++) { 111 outRow[col] = crealf(outBuffer[index++]); // take just the real part 112 } 113 } 114 } else { 115 out = psImageRecycle(out,numCols,numRows,PS_TYPE_C32); 116 int index = 0; 117 for (int row=0; row < numRows; row++) { 118 psC32* outRow = out->data.C32[row]; 119 for (int col=0; col < numCols; col++) { 120 outRow[col] = outBuffer[index++]; // take just the real part 121 } 122 } 123 // memcpy(out->rawDataBuffer, outBuffer, numRows*numCols*sizeof(fftwf_complex)); 124 } 125 126 fftwf_free(outBuffer); 107 127 108 128 return out; -
trunk/psLib/src/image/psImage.c
r3682 r3702 9 9 * @author Ross Harman, MHPCC 10 10 * 11 * @version $Revision: 1.6 3$ $Name: not supported by cvs2svn $12 * @date $Date: 2005-04- 07 20:27:41$11 * @version $Revision: 1.64 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2005-04-15 00:12:08 $ 13 13 * 14 14 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 197 197 } 198 198 199 psImage* psImageCopy(psImage* restrictoutput,199 psImage* psImageCopy(psImage* output, 200 200 const psImage* input, 201 201 psElemType type) … … 350 350 return output; 351 351 } 352 353 bool p_psImageCopyToRawBuffer(void* buffer, 354 const psImage* input, 355 psElemType type) 356 { 357 psElemType inDatatype; 358 psS32 numRows; 359 psS32 numCols; 360 361 if (input == NULL || input->data.V == NULL) { 362 psError(PS_ERR_BAD_PARAMETER_NULL, true, 363 PS_ERRORTEXT_psImage_IMAGE_NULL); 364 return false; 365 } 366 367 if (input->type.dimen != PS_DIMEN_IMAGE) { 368 psError(PS_ERR_BAD_PARAMETER_TYPE, true, 369 PS_ERRORTEXT_psImage_NOT_AN_IMAGE); 370 return false; 371 } 372 373 inDatatype = input->type.type; 374 numRows = input->numRows; 375 numCols = input->numCols; 376 377 // cover the trival case of copy of the same 378 // datatype. 379 if (type == inDatatype) { 380 int rowSize = PSELEMTYPE_SIZEOF(inDatatype)*numCols; 381 for (psS32 row=0;row<numRows;row++) { 382 memcpy(&((psS8*)buffer)[row*rowSize], input->data.V[row], rowSize); 383 } 384 return true; 385 } 386 387 #define PSIMAGE_BUFFER_COPY(INTYPE,OUTTYPE) { \ 388 ps##INTYPE *in; \ 389 ps##OUTTYPE *out = buffer; \ 390 for(psS32 row=0;row<numRows;row++) { \ 391 in = input->data.INTYPE[row]; \ 392 for (psS32 col=0;col<numCols;col++) { \ 393 *(out++) = *(in++); \ 394 } \ 395 } \ 396 } 397 398 #define PSIMAGE_BUFFER_COPY_CASE(OUT,OUTTYPE) { \ 399 switch (inDatatype) { \ 400 case PS_TYPE_S8: \ 401 PSIMAGE_BUFFER_COPY(S8,OUTTYPE); \ 402 break; \ 403 case PS_TYPE_S16: \ 404 PSIMAGE_BUFFER_COPY(S16,OUTTYPE); \ 405 break; \ 406 case PS_TYPE_S32: \ 407 PSIMAGE_BUFFER_COPY(S32,OUTTYPE); \ 408 break; \ 409 case PS_TYPE_S64: \ 410 PSIMAGE_BUFFER_COPY(S64,OUTTYPE); \ 411 break; \ 412 case PS_TYPE_U8: \ 413 PSIMAGE_BUFFER_COPY(U8,OUTTYPE); \ 414 break; \ 415 case PS_TYPE_U16: \ 416 PSIMAGE_BUFFER_COPY(U16,OUTTYPE); \ 417 break; \ 418 case PS_TYPE_U32: \ 419 PSIMAGE_BUFFER_COPY(U32,OUTTYPE); \ 420 break; \ 421 case PS_TYPE_U64: \ 422 PSIMAGE_BUFFER_COPY(U64,OUTTYPE); \ 423 break; \ 424 case PS_TYPE_F32: \ 425 PSIMAGE_BUFFER_COPY(F32,OUTTYPE); \ 426 break; \ 427 case PS_TYPE_F64: \ 428 PSIMAGE_BUFFER_COPY(F64,OUTTYPE); \ 429 break; \ 430 case PS_TYPE_C32: \ 431 PSIMAGE_BUFFER_COPY(C32,OUTTYPE); \ 432 break; \ 433 case PS_TYPE_C64: \ 434 PSIMAGE_BUFFER_COPY(C64,OUTTYPE); \ 435 break; \ 436 default: \ 437 break; \ 438 } \ 439 } 440 441 switch (type) { 442 case PS_TYPE_S8: 443 PSIMAGE_BUFFER_COPY_CASE(output, S8); 444 break; 445 case PS_TYPE_S16: 446 PSIMAGE_BUFFER_COPY_CASE(output, S16); 447 break; 448 case PS_TYPE_S32: 449 PSIMAGE_BUFFER_COPY_CASE(output, S32); 450 break; 451 case PS_TYPE_S64: 452 PSIMAGE_BUFFER_COPY_CASE(output, S64); 453 break; 454 case PS_TYPE_U8: 455 PSIMAGE_BUFFER_COPY_CASE(output, U8); 456 break; 457 case PS_TYPE_U16: 458 PSIMAGE_BUFFER_COPY_CASE(output, U16); 459 break; 460 case PS_TYPE_U32: 461 PSIMAGE_BUFFER_COPY_CASE(output, U32); 462 break; 463 case PS_TYPE_U64: 464 PSIMAGE_BUFFER_COPY_CASE(output, U64); 465 break; 466 case PS_TYPE_F32: 467 PSIMAGE_BUFFER_COPY_CASE(output, F32); 468 break; 469 case PS_TYPE_F64: 470 PSIMAGE_BUFFER_COPY_CASE(output, F64); 471 break; 472 case PS_TYPE_C32: 473 PSIMAGE_BUFFER_COPY_CASE(output, C32); 474 break; 475 case PS_TYPE_C64: 476 PSIMAGE_BUFFER_COPY_CASE(output, C64); 477 break; 478 default: { 479 char* typeStr; 480 PS_TYPE_NAME(typeStr,type); 481 psError(PS_ERR_BAD_PARAMETER_TYPE, true, 482 PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED, 483 typeStr); 484 break; 485 } 486 } 487 return true; 488 } 489 352 490 353 491 psS32 psImageFreeChildren(psImage* image) -
trunk/psLib/src/image/psImage.h
r3446 r3702 11 11 * @author Ross Harman, MHPCC 12 12 * 13 * @version $Revision: 1. 49$ $Name: not supported by cvs2svn $14 * @date $Date: 2005-0 3-18 02:35:14$13 * @version $Revision: 1.50 $ $Name: not supported by cvs2svn $ 14 * @date $Date: 2005-04-15 00:12:08 $ 15 15 * 16 16 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 167 167 ); 168 168 169 bool p_psImageCopyToRawBuffer( 170 void* buffer, 171 const psImage* input, 172 psElemType type 173 ); 174 169 175 /** Frees all children of a psImage. 170 176 * -
trunk/psLib/src/image/psImageConvolve.c
r3682 r3702 5 5 * @author Robert DeSonia, MHPCC 6 6 * 7 * @version $Revision: 1.1 3$ $Name: not supported by cvs2svn $8 * @date $Date: 2005-04- 07 20:27:41$7 * @version $Revision: 1.14 $ $Name: not supported by cvs2svn $ 8 * @date $Date: 2005-04-15 00:12:08 $ 9 9 * 10 10 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 398 398 } 399 399 400 psImageWriteSection(paddedImage,0,0,0,NULL,0,"paddedImage.fits");401 402 400 // pad the kernel to the same size of paddedImage 403 401 psImage* paddedKernel = psImageAlloc(paddedCols,paddedRows,PS_TYPE_KERNEL); … … 421 419 } 422 420 423 psImageWriteSection(paddedKernel,0,0,0,NULL,0,"paddedKernel.fits");424 425 421 psImage* kernelFourier = psImageFFT(NULL, paddedKernel, PS_FFT_FORWARD); 426 422 if (kernelFourier == NULL) { … … 440 436 441 437 // convolution in fourier domain is just a pixel-wise multiplication 442 psBinaryOp(inFourier,inFourier,"*",kernelFourier); 438 for (int row = 0; row < paddedRows; row++) { 439 psC32* inRow = inFourier->data.C32[row]; 440 psC32* kRow = kernelFourier->data.C32[row]; 441 for (int col = 0; col < paddedCols; col++) { 442 inRow[col] *= kRow[col]; 443 } 444 } 443 445 444 446 psImage* complexOut = psImageFFT(NULL, inFourier, … … 451 453 } 452 454 453 {454 psImage* tmp = psImageReal(NULL,complexOut);455 psImageWriteSection(tmp,0,0,0,NULL,0,"complexOut.fits");456 psFree(tmp);457 }458 459 455 // subset out the padded area now. 460 456 psImage* complexOutSansPad = psImageSubset(complexOut, … … 463 459 464 460 out = psImageRecycle(out,numCols,numRows,PS_TYPE_F32); 465 float factor = 1.0f/ numCols/numRows;461 float factor = 1.0f/(float)paddedCols/(float)paddedRows; 466 462 for (psS32 row = 0; row < numRows; row++) { 467 463 psF32* outRow = out->data.F32[row]; -
trunk/psLib/src/image/psImageFFT.c
r3671 r3702 5 5 * @author Robert DeSonia, MHPCC 6 6 * 7 * @version $Revision: 1.1 0$ $Name: not supported by cvs2svn $8 * @date $Date: 2005-04- 06 01:12:58 $7 * @version $Revision: 1.11 $ $Name: not supported by cvs2svn $ 8 * @date $Date: 2005-04-15 00:12:08 $ 9 9 * 10 10 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 74 74 // n.b. FFTW can perform a in-place transform at the same rate or faster than out-of-place. 75 75 psS32 sign = ((direction & PS_FFT_FORWARD) != 0) ? FFTW_FORWARD : FFTW_BACKWARD; 76 out = psImageCopy(out, in, PS_TYPE_C32); 77 plan = fftwf_plan_dft_2d(numCols, numRows, 78 out->data.C32[0], 79 out->data.C32[0], 76 77 fftwf_complex* outBuffer = fftwf_malloc(numRows*numCols*sizeof(fftwf_complex)); 78 p_psImageCopyToRawBuffer(outBuffer, in, PS_TYPE_C32); 79 80 plan = fftwf_plan_dft_2d(numRows, numCols, 81 outBuffer, 82 outBuffer, 80 83 sign, 81 84 PS_FFTW_PLAN_RIGOR); … … 101 104 // becomes an issue, the use of fftwf_plan_dft_r2c should be considered 102 105 // as well as fftwf_plan_dft_c2r. 103 psImage* realOut = psImageCopy(NULL,out,PS_TYPE_F32); 104 psFree(out); 105 out = realOut; 106 } 106 out = psImageRecycle(out,numCols,numRows,PS_TYPE_F32); 107 int index = 0; 108 for (int row=0; row < numRows; row++) { 109 psF32* outRow = out->data.F32[row]; 110 for (int col=0; col < numCols; col++) { 111 outRow[col] = crealf(outBuffer[index++]); // take just the real part 112 } 113 } 114 } else { 115 out = psImageRecycle(out,numCols,numRows,PS_TYPE_C32); 116 int index = 0; 117 for (int row=0; row < numRows; row++) { 118 psC32* outRow = out->data.C32[row]; 119 for (int col=0; col < numCols; col++) { 120 outRow[col] = outBuffer[index++]; // take just the real part 121 } 122 } 123 // memcpy(out->rawDataBuffer, outBuffer, numRows*numCols*sizeof(fftwf_complex)); 124 } 125 126 fftwf_free(outBuffer); 107 127 108 128 return out; -
trunk/psLib/src/imageops/psImageConvolve.c
r3682 r3702 5 5 * @author Robert DeSonia, MHPCC 6 6 * 7 * @version $Revision: 1.1 3$ $Name: not supported by cvs2svn $8 * @date $Date: 2005-04- 07 20:27:41$7 * @version $Revision: 1.14 $ $Name: not supported by cvs2svn $ 8 * @date $Date: 2005-04-15 00:12:08 $ 9 9 * 10 10 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 398 398 } 399 399 400 psImageWriteSection(paddedImage,0,0,0,NULL,0,"paddedImage.fits");401 402 400 // pad the kernel to the same size of paddedImage 403 401 psImage* paddedKernel = psImageAlloc(paddedCols,paddedRows,PS_TYPE_KERNEL); … … 421 419 } 422 420 423 psImageWriteSection(paddedKernel,0,0,0,NULL,0,"paddedKernel.fits");424 425 421 psImage* kernelFourier = psImageFFT(NULL, paddedKernel, PS_FFT_FORWARD); 426 422 if (kernelFourier == NULL) { … … 440 436 441 437 // convolution in fourier domain is just a pixel-wise multiplication 442 psBinaryOp(inFourier,inFourier,"*",kernelFourier); 438 for (int row = 0; row < paddedRows; row++) { 439 psC32* inRow = inFourier->data.C32[row]; 440 psC32* kRow = kernelFourier->data.C32[row]; 441 for (int col = 0; col < paddedCols; col++) { 442 inRow[col] *= kRow[col]; 443 } 444 } 443 445 444 446 psImage* complexOut = psImageFFT(NULL, inFourier, … … 451 453 } 452 454 453 {454 psImage* tmp = psImageReal(NULL,complexOut);455 psImageWriteSection(tmp,0,0,0,NULL,0,"complexOut.fits");456 psFree(tmp);457 }458 459 455 // subset out the padded area now. 460 456 psImage* complexOutSansPad = psImageSubset(complexOut, … … 463 459 464 460 out = psImageRecycle(out,numCols,numRows,PS_TYPE_F32); 465 float factor = 1.0f/ numCols/numRows;461 float factor = 1.0f/(float)paddedCols/(float)paddedRows; 466 462 for (psS32 row = 0; row < numRows; row++) { 467 463 psF32* outRow = out->data.F32[row]; -
trunk/psLib/src/mathtypes/psImage.c
r3682 r3702 9 9 * @author Ross Harman, MHPCC 10 10 * 11 * @version $Revision: 1.6 3$ $Name: not supported by cvs2svn $12 * @date $Date: 2005-04- 07 20:27:41$11 * @version $Revision: 1.64 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2005-04-15 00:12:08 $ 13 13 * 14 14 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 197 197 } 198 198 199 psImage* psImageCopy(psImage* restrictoutput,199 psImage* psImageCopy(psImage* output, 200 200 const psImage* input, 201 201 psElemType type) … … 350 350 return output; 351 351 } 352 353 bool p_psImageCopyToRawBuffer(void* buffer, 354 const psImage* input, 355 psElemType type) 356 { 357 psElemType inDatatype; 358 psS32 numRows; 359 psS32 numCols; 360 361 if (input == NULL || input->data.V == NULL) { 362 psError(PS_ERR_BAD_PARAMETER_NULL, true, 363 PS_ERRORTEXT_psImage_IMAGE_NULL); 364 return false; 365 } 366 367 if (input->type.dimen != PS_DIMEN_IMAGE) { 368 psError(PS_ERR_BAD_PARAMETER_TYPE, true, 369 PS_ERRORTEXT_psImage_NOT_AN_IMAGE); 370 return false; 371 } 372 373 inDatatype = input->type.type; 374 numRows = input->numRows; 375 numCols = input->numCols; 376 377 // cover the trival case of copy of the same 378 // datatype. 379 if (type == inDatatype) { 380 int rowSize = PSELEMTYPE_SIZEOF(inDatatype)*numCols; 381 for (psS32 row=0;row<numRows;row++) { 382 memcpy(&((psS8*)buffer)[row*rowSize], input->data.V[row], rowSize); 383 } 384 return true; 385 } 386 387 #define PSIMAGE_BUFFER_COPY(INTYPE,OUTTYPE) { \ 388 ps##INTYPE *in; \ 389 ps##OUTTYPE *out = buffer; \ 390 for(psS32 row=0;row<numRows;row++) { \ 391 in = input->data.INTYPE[row]; \ 392 for (psS32 col=0;col<numCols;col++) { \ 393 *(out++) = *(in++); \ 394 } \ 395 } \ 396 } 397 398 #define PSIMAGE_BUFFER_COPY_CASE(OUT,OUTTYPE) { \ 399 switch (inDatatype) { \ 400 case PS_TYPE_S8: \ 401 PSIMAGE_BUFFER_COPY(S8,OUTTYPE); \ 402 break; \ 403 case PS_TYPE_S16: \ 404 PSIMAGE_BUFFER_COPY(S16,OUTTYPE); \ 405 break; \ 406 case PS_TYPE_S32: \ 407 PSIMAGE_BUFFER_COPY(S32,OUTTYPE); \ 408 break; \ 409 case PS_TYPE_S64: \ 410 PSIMAGE_BUFFER_COPY(S64,OUTTYPE); \ 411 break; \ 412 case PS_TYPE_U8: \ 413 PSIMAGE_BUFFER_COPY(U8,OUTTYPE); \ 414 break; \ 415 case PS_TYPE_U16: \ 416 PSIMAGE_BUFFER_COPY(U16,OUTTYPE); \ 417 break; \ 418 case PS_TYPE_U32: \ 419 PSIMAGE_BUFFER_COPY(U32,OUTTYPE); \ 420 break; \ 421 case PS_TYPE_U64: \ 422 PSIMAGE_BUFFER_COPY(U64,OUTTYPE); \ 423 break; \ 424 case PS_TYPE_F32: \ 425 PSIMAGE_BUFFER_COPY(F32,OUTTYPE); \ 426 break; \ 427 case PS_TYPE_F64: \ 428 PSIMAGE_BUFFER_COPY(F64,OUTTYPE); \ 429 break; \ 430 case PS_TYPE_C32: \ 431 PSIMAGE_BUFFER_COPY(C32,OUTTYPE); \ 432 break; \ 433 case PS_TYPE_C64: \ 434 PSIMAGE_BUFFER_COPY(C64,OUTTYPE); \ 435 break; \ 436 default: \ 437 break; \ 438 } \ 439 } 440 441 switch (type) { 442 case PS_TYPE_S8: 443 PSIMAGE_BUFFER_COPY_CASE(output, S8); 444 break; 445 case PS_TYPE_S16: 446 PSIMAGE_BUFFER_COPY_CASE(output, S16); 447 break; 448 case PS_TYPE_S32: 449 PSIMAGE_BUFFER_COPY_CASE(output, S32); 450 break; 451 case PS_TYPE_S64: 452 PSIMAGE_BUFFER_COPY_CASE(output, S64); 453 break; 454 case PS_TYPE_U8: 455 PSIMAGE_BUFFER_COPY_CASE(output, U8); 456 break; 457 case PS_TYPE_U16: 458 PSIMAGE_BUFFER_COPY_CASE(output, U16); 459 break; 460 case PS_TYPE_U32: 461 PSIMAGE_BUFFER_COPY_CASE(output, U32); 462 break; 463 case PS_TYPE_U64: 464 PSIMAGE_BUFFER_COPY_CASE(output, U64); 465 break; 466 case PS_TYPE_F32: 467 PSIMAGE_BUFFER_COPY_CASE(output, F32); 468 break; 469 case PS_TYPE_F64: 470 PSIMAGE_BUFFER_COPY_CASE(output, F64); 471 break; 472 case PS_TYPE_C32: 473 PSIMAGE_BUFFER_COPY_CASE(output, C32); 474 break; 475 case PS_TYPE_C64: 476 PSIMAGE_BUFFER_COPY_CASE(output, C64); 477 break; 478 default: { 479 char* typeStr; 480 PS_TYPE_NAME(typeStr,type); 481 psError(PS_ERR_BAD_PARAMETER_TYPE, true, 482 PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED, 483 typeStr); 484 break; 485 } 486 } 487 return true; 488 } 489 352 490 353 491 psS32 psImageFreeChildren(psImage* image) -
trunk/psLib/src/mathtypes/psImage.h
r3446 r3702 11 11 * @author Ross Harman, MHPCC 12 12 * 13 * @version $Revision: 1. 49$ $Name: not supported by cvs2svn $14 * @date $Date: 2005-0 3-18 02:35:14$13 * @version $Revision: 1.50 $ $Name: not supported by cvs2svn $ 14 * @date $Date: 2005-04-15 00:12:08 $ 15 15 * 16 16 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 167 167 ); 168 168 169 bool p_psImageCopyToRawBuffer( 170 void* buffer, 171 const psImage* input, 172 psElemType type 173 ); 174 169 175 /** Frees all children of a psImage. 170 176 * -
trunk/psLib/test/image/tst_psImageConvolve.c
r3682 r3702 5 5 * @author Robert DeSonia, MHPCC 6 6 * 7 * @version $Revision: 1. 9$ $Name: not supported by cvs2svn $8 * @date $Date: 2005-04- 07 20:27:42$7 * @version $Revision: 1.10 $ $Name: not supported by cvs2svn $ 8 * @date $Date: 2005-04-15 00:12:09 $ 9 9 * 10 10 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 22 22 static psS32 testKernelAlloc(void); 23 23 static psS32 testKernelGenerate(void); 24 //static psS32 testImageConvolve(void);24 static psS32 testImageConvolve(void); 25 25 26 26 testDescription tests[] = { 27 27 {testKernelAlloc,731,"psKernelAlloc",0,false}, 28 28 {testKernelGenerate,732,"psKernelGenerate",0,false}, 29 //{testImageConvolve,733,"psImageConvolve",0,false},29 {testImageConvolve,733,"psImageConvolve",0,false}, 30 30 {NULL} 31 31 }; … … 286 286 } 287 287 288 /*289 288 static psS32 testImageConvolve(void) 290 289 { … … 292 291 const psS32 c = 300; 293 292 psS32 sum; 294 293 295 294 // approximate a normalized gaussian kernel. 296 295 psKernel* g = psKernelAlloc(-1,1,-1,1); … … 304 303 g->kernel[0][1] = 0.0838; 305 304 g->kernel[0][0] = 0.6193; 306 305 307 306 // create a normalized non-symetric kernel. 308 307 psKernel* nsk = psKernelAlloc(0,2,0,2); … … 319 318 } 320 319 } 321 322 320 321 323 322 psImage* img = psImageAlloc(c,r,PS_TYPE_F32); 324 323 memset(img->data.F32[0],0,c*r*PSELEMTYPE_SIZEOF(PS_TYPE_F32)); … … 326 325 img->data.F32[r/2][c/2] = 1.0f; 327 326 img->data.F32[r-1][c/2] = 1.0f; 328 327 329 328 // test spacial convolution of gaussian 330 329 psLogMsg(__func__,PS_LOG_INFO,"Testing direct gaussian convolution"); 331 330 psImage* out = psImageConvolve(NULL, img, g, true); 332 331 333 332 if (out == NULL) { 334 333 psError(PS_ERR_UNKNOWN, true, "psImageConvolve returned a NULL for direct gaussian case."); 335 334 return 1; 336 335 } 337 336 338 337 if (out->numCols != c || out->numRows != r) { 339 338 psError(PS_ERR_UNKNOWN, true, "psImageConvolve result image is %dx%d, but expected %dx%d.", … … 342 341 return 2; 343 342 } 344 343 345 344 if (out->type.type != PS_TYPE_F32) { 346 345 char* typeStr; … … 350 349 return 3; 351 350 } 352 351 353 352 // test values 354 353 for (psS32 i=-1;i<1;i++) { … … 374 373 } 375 374 } 376 375 377 376 // test fourier convolution of gaussian 378 377 psLogMsg(__func__,PS_LOG_INFO,"Testing fourier gaussian convolution"); 379 psKernel* gg = psKernelAlloc(1,3,1,3); 380 gg->kernel[1][1] = 381 gg->kernel[1][3] = 382 gg->kernel[3][1] = 383 gg->kernel[3][3] = 0.0113; 384 gg->kernel[3][2] = 385 gg->kernel[1][2] = 386 gg->kernel[2][1] = 387 gg->kernel[2][3] = 0.0838; 388 gg->kernel[2][2] = 0.6193; 389 img->data.F32[0][0] = 0.0f; 390 img->data.F32[r/2][c/2] = 1.0f; 391 img->data.F32[r-1][c/2] = 0.0f; 392 psImage* out2 = psImageConvolve(out, img, gg, false); 393 378 psImage* out2 = psImageConvolve(out, img, g, false); 379 394 380 if (out == NULL) { 395 381 psError(PS_ERR_UNKNOWN, true, "psImageConvolve returned a NULL for gaussian case."); 396 382 return 10; 397 383 } 398 384 399 385 if (out != out2) { 400 386 psError(PS_ERR_UNKNOWN, true, "psImageConvolve didn't recycle the supplied out image struct."); 401 387 return 11; 402 388 } 403 389 404 390 if (out->numCols != c || out->numRows != r) { 405 391 psError(PS_ERR_UNKNOWN, true, "psImageConvolve result image is %dx%d, but expected %dx%d.", … … 408 394 return 12; 409 395 } 410 396 411 397 if (out->type.type != PS_TYPE_F32) { 412 398 char* typeStr; … … 416 402 return 13; 417 403 } 418 419 psImageWriteSection(out2,0,0,0,NULL,0,"out2.fits"); 404 420 405 // test values 421 406 for (psS32 i=-1;i<1;i++) { 422 407 for (psS32 j=-1;j<1;j++) { 423 if (fabsf(out->data.F32[r/2+i][c/2+j] - g->kernel[i][j]) > 0.0 001) {408 if (fabsf(out->data.F32[r/2+i][c/2+j] - g->kernel[i][j]) > 0.01) { 424 409 psError(PS_ERR_UNKNOWN, true,"Convolved image wrong at %d,%d. Value is %g, expected %g.", 425 410 c/2+j,r/2+i, 426 411 out->data.F32[r/2+i][c/2+j], g->kernel[i][j]); 427 psImageWriteSection(out,0,0,0,NULL,0,"problem.fits");428 412 return 14; 429 413 } 430 if (i >= 0 && j >= 0 && fabsf(out->data.F32[i][j] - g->kernel[i][j]) > 0.0 001) {414 if (i >= 0 && j >= 0 && fabsf(out->data.F32[i][j] - g->kernel[i][j]) > 0.01) { 431 415 psError(PS_ERR_UNKNOWN, true,"Convolved image wrong at %d,%d. Value is %g, expected %g.", 432 416 j,i, … … 434 418 return 15; 435 419 } 436 if (i <= 0 && fabsf(out->data.F32[r-1+i][c/2+j] - g->kernel[i][j]) > 0.0 001) {420 if (i <= 0 && fabsf(out->data.F32[r-1+i][c/2+j] - g->kernel[i][j]) > 0.01) { 437 421 psError(PS_ERR_UNKNOWN, true,"Convolved image wrong at %d,%d. Value is %g, expected %g.", 438 422 c/2+j,r-1+i, … … 442 426 } 443 427 } 444 428 445 429 psFree(g); 446 430 psFree(img); … … 449 433 return 0; 450 434 } 451 */ 452 435 -
trunk/psLib/test/image/tst_psImageFFT.c
r3682 r3702 6 6 * @author Robert DeSonia, MHPCC 7 7 * 8 * @version $Revision: 1.1 7$ $Name: not supported by cvs2svn $9 * @date $Date: 2005-04- 07 20:27:42$8 * @version $Revision: 1.18 $ $Name: not supported by cvs2svn $ 9 * @date $Date: 2005-04-15 00:12:09 $ 10 10 * 11 11 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 68 68 69 69 // 1. assign a image to a radial sinisoid 70 GENIMAGE(img,m,n,F32, sinf((32.0f-row)/ 16.0f*PS_PI)+sinf((64.0f-col)/32.0f*PS_PI));70 GENIMAGE(img,m,n,F32, sinf((32.0f-row)/32.0f*PS_PI)+sinf((64.0f-col)/64.0f*PS_PI)); 71 71 72 72 // 2. perform a forward transform … … 88 88 psF32 mag = cabsf(img2Row[col])/m/n; 89 89 if (mag > 0.1f) { 90 // must be (0,1) or (0,n-1) or (1,0) or ( n-1,0)90 // must be (0,1) or (0,n-1) or (1,0) or (m-1,0) 91 91 if (! (col == 0 && (row == 1 || row == n-1)) 92 && ! (row == 0 && (col==1 || col == n-1)) ) {92 && ! (row == 0 && (col==1 || col == m-1)) ) { 93 93 psError(PS_ERR_UNKNOWN, true,"Result invalid at %d,%d (%.2f)",col,row,mag); 94 94 return 3; … … 96 96 } else 97 97 if ( (col == 0 && (row == 1 || row == n-1)) 98 || (row == 0 && (col==1 || col == n-1)) ) {98 || (row == 0 && (col==1 || col == m-1)) ) { 99 99 psError(PS_ERR_UNKNOWN, true,"Result invalid at %d,%d (%.2f)",col,row,mag); 100 100 return 4;
Note:
See TracChangeset
for help on using the changeset viewer.
