Changeset 6482
- Timestamp:
- Feb 24, 2006, 9:59:12 AM (20 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/rel10_ifa/psLib/src/imageops/psImageConvolve.c
r6226 r6482 5 5 * @author Robert DeSonia, MHPCC 6 6 * 7 * @version $Revision: 1.30 $ $Name: not supported by cvs2svn $8 * @date $Date: 2006-0 1-27 20:08:58$7 * @version $Revision: 1.30.4.1 $ $Name: not supported by cvs2svn $ 8 * @date $Date: 2006-02-24 19:59:12 $ 9 9 * 10 10 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 493 493 PS_ASSERT_IMAGE_NON_NULL(image, NULL); 494 494 495 int Nx, Ny, Npixel, Nrange ;496 double factor, g, s ;495 int Nx, Ny, Npixel, Nrange, Nr; 496 double factor, g, s, sum; 497 497 psVector *temp; 498 498 … … 507 507 #define IMAGESMOOTH_CASE(TYPE) \ 508 508 case PS_TYPE_##TYPE: { \ 509 /* generate gaussian */ \509 /* generate normalized gaussian */ \ 510 510 psVector *gaussnorm = psVectorAlloc (Npixel, PS_TYPE_##TYPE); \ 511 sum = 0.0; \ 511 512 for (int i = -Nrange; i < Nrange + 1; i++) { \ 512 513 gaussnorm->data.TYPE[i+Nrange] = exp (factor*i*i); \ 514 sum += gaussnorm->data.TYPE[i+Nrange]; \ 515 } \ 516 for (int i = -Nrange; i < Nrange + 1; i++) { \ 517 gaussnorm->data.TYPE[i+Nrange] /= sum; \ 513 518 } \ 514 519 ps##TYPE *gauss = &gaussnorm->data.TYPE[Nrange]; \ … … 519 524 ps##TYPE *vi = image->data.TYPE[j]; \ 520 525 ps##TYPE *vo = temp->data.TYPE; \ 521 for (int i = 0; i < Nx; i++) { \ 526 /* smooth first Nrange pixels, with renorm */ \ 527 /* XXX need to check that this does not run over end for narrow images */ \ 528 for (int i = 0; i < Nrange; i++, vi++, vo++) { \ 529 ps##TYPE *vr = vi - i; \ 530 ps##TYPE *vg = gauss - i; \ 522 531 g = s = 0; \ 523 for (int n = -Nrange; n < Nrange + 1; n++) { \ 524 if (i+n < 0) \ 525 continue; \ 526 if (i+n >= Nx) \ 527 continue; \ 528 s += gauss[n]*vi[i+n]; \ 529 g += gauss[n]; \ 532 for (int n = -i; n < Nrange + 1; n++, vr++, vg++) { \ 533 s += *vg * *vr; \ 534 g += *vg; \ 530 535 } \ 531 vo[i] = s / g; \ 536 *vo = s / g; \ 537 } \ 538 /* smooth middle pixels */ \ 539 for (int i = Nrange; i < Nx - Nrange; i++, vi++, vo++) { \ 540 ps##TYPE *vr = vi - Nrange; \ 541 ps##TYPE *vg = gauss - Nrange; \ 542 s = 0; \ 543 for (int n = -Nrange; n < Nrange + 1; n++, vr++, vg++) { \ 544 s += *vg * *vr; \ 545 } \ 546 *vo = s; \ 547 } \ 548 /* smooth last Nrange pixels, with renorm */ \ 549 /* XXX does this miss the last column? */ \ 550 for (int i = Nx - Nrange; i < Nx; i++, vi++, vo++) { \ 551 ps##TYPE *vr = vi - Nrange; \ 552 ps##TYPE *vg = gauss - Nrange; \ 553 g = s = 0; \ 554 for (int n = -Nrange; n < Nx - i - 1; n++, vr++, vg++) { \ 555 s += *vg * *vr; \ 556 g += *vg; \ 557 } \ 558 *vo = s / g; \ 532 559 } \ 533 560 memcpy (image->data.TYPE[j], temp->data.TYPE, Nx*sizeof(ps##TYPE)); \ … … 536 563 \ 537 564 /* smooth in Y direction */ \ 538 temp = psVectorAlloc (image->numRows, PS_TYPE_##TYPE); \539 for (int i = 0; i < Nx; i++) {\540 ps##TYPE *vo = temp->data.TYPE;\541 ps##TYPE **vi = image->data.TYPE; \542 for (int j = 0; j < Ny; j++) {\543 g = s = 0; \544 for (int n = -Nrange; n < Nrange + 1; n++) {\545 if (j+n < 0)\546 continue; \547 if (j+n >= Ny)\548 continue; \549 s += gauss[n]*vi[j+n][i];\550 g += gauss[n]; \565 psArray *temprows = psArrayAlloc (Nrange); \ 566 temprows->n = Nrange; \ 567 for (int j = 0; j < Nrange; j++) { \ 568 temp = psVectorAlloc (Nx, PS_TYPE_##TYPE); \ 569 /* zero the output row */ \ 570 memset (temp->data.TYPE, 0, Nx*sizeof(PS_TYPE_##TYPE)); \ 571 for (int n = -j, sum = 0; n < Nrange + 1; n++) { sum += gauss[n]; } \ 572 for (int n = -j; n < Nrange + 1; n++) { \ 573 ps##TYPE *vi = image->data.TYPE[j+n]; \ 574 ps##TYPE *vo = temp->data.TYPE; \ 575 g = gauss[n]; \ 576 for (int i = 0; i < Nx; i++, vi++, vo++) { \ 577 *vo += *vi * g; \ 551 578 } \ 552 vo[j] = s / g; \ 553 } \ 554 /* replace temp in image */ \ 555 for (int j = 0; j < Ny; j++) { \ 556 vi[j][i] = vo[j]; \ 557 } \ 558 } \ 559 psFree (temp); \ 579 } \ 580 /* save output rows on temp array */ \ 581 temprows->data[j] = temp; \ 582 } \ 583 for (int j = Nrange; j < Ny - Nrange; j++) { \ 584 /* save the Nrange-offset output row, then zero */ \ 585 Nr = j % Nrange; \ 586 temp = temprows->data[Nr]; \ 587 memcpy (image->data.TYPE[j-Nrange], temp->data.TYPE, Nx*sizeof(ps##TYPE)); \ 588 memset (temp->data.TYPE, 0, Nx*sizeof(PS_TYPE_##TYPE)); \ 589 for (int n = -Nrange; n < Nrange + 1; n++) { \ 590 ps##TYPE *vi = image->data.TYPE[j+n]; \ 591 ps##TYPE *vo = temp->data.TYPE; \ 592 g = gauss[n]; \ 593 for (int i = 0; i < Nx; i++, vi++, vo++) { \ 594 *vo += *vi * g; \ 595 } \ 596 } \ 597 } \ 598 for (int j = Ny - Nrange; j < Ny; j++) { \ 599 /* save the Nrange-offset output row, then zero */ \ 600 Nr = j % Nrange; \ 601 temp = temprows->data[Nr]; \ 602 memcpy (image->data.TYPE[j-Nrange], temp->data.TYPE, Nx*sizeof(ps##TYPE)); \ 603 memset (temp->data.TYPE, 0, Nx*sizeof(PS_TYPE_##TYPE)); \ 604 for (int n = -Nrange, sum = 0; n < Ny - j - 1; n++) { sum += gauss[n]; } \ 605 for (int n = -Nrange; n < Ny - j - 1; n++) { \ 606 ps##TYPE *vi = image->data.TYPE[j+n]; \ 607 ps##TYPE *vo = temp->data.TYPE; \ 608 g = gauss[n]; \ 609 for (int i = 0; i < Nx; i++, vi++, vo++) { \ 610 *vo += *vi * g; \ 611 } \ 612 } \ 613 } \ 614 for (int j = Ny; j < Ny + Nrange; j++) { \ 615 /* save the Nrange-offset output row, then zero */ \ 616 Nr = j % Nrange; \ 617 temp = temprows->data[Nr]; \ 618 memcpy (image->data.TYPE[j-Nrange], temp->data.TYPE, Nx*sizeof(ps##TYPE)); \ 619 } \ 620 psFree (temprows); \ 560 621 psFree (gaussnorm); \ 561 622 break; \
Note:
See TracChangeset
for help on using the changeset viewer.
