IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 6482


Ignore:
Timestamp:
Feb 24, 2006, 9:59:12 AM (20 years ago)
Author:
magnier
Message:

serious code improvement on psImageSmooth

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/rel10_ifa/psLib/src/imageops/psImageConvolve.c

    r6226 r6482  
    55 *  @author Robert DeSonia, MHPCC
    66 *
    7  *  @version $Revision: 1.30 $ $Name: not supported by cvs2svn $
    8  *  @date $Date: 2006-01-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 $
    99 *
    1010 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    493493    PS_ASSERT_IMAGE_NON_NULL(image, NULL);
    494494
    495     int Nx, Ny, Npixel, Nrange;
    496     double factor, g, s;
     495    int Nx, Ny, Npixel, Nrange, Nr;
     496    double factor, g, s, sum;
    497497    psVector *temp;
    498498
     
    507507    #define IMAGESMOOTH_CASE(TYPE) \
    508508case PS_TYPE_##TYPE: { \
    509         /* generate gaussian */ \
     509        /* generate normalized gaussian */ \
    510510        psVector *gaussnorm = psVectorAlloc (Npixel, PS_TYPE_##TYPE); \
     511        sum = 0.0; \
    511512        for (int i = -Nrange; i < Nrange + 1; i++) { \
    512513            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; \
    513518        } \
    514519        ps##TYPE *gauss = &gaussnorm->data.TYPE[Nrange]; \
     
    519524            ps##TYPE *vi = image->data.TYPE[j]; \
    520525            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; \
    522531                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; \
    530535                } \
    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; \
    532559            } \
    533560            memcpy (image->data.TYPE[j], temp->data.TYPE, Nx*sizeof(ps##TYPE)); \
     
    536563        \
    537564        /* 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; \
    551578                } \
    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); \
    560621        psFree (gaussnorm); \
    561622        break; \
Note: See TracChangeset for help on using the changeset viewer.