IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 5227


Ignore:
Timestamp:
Oct 5, 2005, 4:41:07 PM (21 years ago)
Author:
drobbin
Message:

Created ImageMaskOps file. started ImageGrowMask fxn.

Location:
trunk/psLib
Files:
3 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/imageops/Makefile.am

    r4981 r5227  
    1010        psImagePixelManip.c \
    1111        psImageStats.c \
    12         psImageStructManip.c
     12        psImageStructManip.c \
     13    psImageMaskOps.c
    1314
    1415EXTRA_DIST = imageops.i
     
    2122        psImagePixelManip.h \
    2223        psImageStats.h \
    23         psImageStructManip.h
     24        psImageStructManip.h \
     25    psImageMaskOps.h
  • trunk/psLib/src/imageops/psImagePixelManip.c

    r5224 r5227  
    1010 *  @author Ross Harman, MHPCC
    1111 *
    12  *  @version $Revision: 1.13 $ $Name: not supported by cvs2svn $
    13  *  @date $Date: 2005-10-05 03:51:43 $
     12 *  @version $Revision: 1.14 $ $Name: not supported by cvs2svn $
     13 *  @date $Date: 2005-10-06 02:41:07 $
    1414 *
    1515 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    396396}
    397397
    398 // mask the area contained by the region
    399 // the region is defined wrt the parent image
    400 void psImageMaskRegion(psImage *image,
    401                        psRegion region,
    402                        const char *op,
    403                        psMaskType maskValue)
    404 {
    405     for (int j = 0; j < image->numRows; j++) {
    406         for (int i = 0; i < image->numCols; i++) {
    407             if ( (j + image->row0) >= region.y0 &&
    408                     (j + image->row0) <= region.y1 &&
    409                     (i + image->col0) >= region.x0 &&
    410                     (i + image->col0) <= region.x1 ) {
    411                 if ( !strncmp(op, "&", 2) || !strncmp(op, "AND", 5) ) {
    412                     image->data.PS_TYPE_MASK_DATA[j][i] &= maskValue;
    413                 } else if ( !strncmp(op, "|", 2) || !strncmp(op, "OR", 5) ) {
    414                     image->data.PS_TYPE_MASK_DATA[j][i] |= maskValue;
    415                 } else if ( !strncmp(op, "=", 2) || !strncmp(op, "EQUAL", 5) ) {
    416                     image->data.PS_TYPE_MASK_DATA[j][i] = maskValue;
    417                 } else if ( !strncmp(op, "^", 2) || !strncmp(op, "XOR", 5) ) {
    418                     image->data.PS_TYPE_MASK_DATA[j][i] ^= maskValue;
    419                 } else {
    420                     psError(PS_ERR_BAD_PARAMETER_VALUE,true,
    421                             "The logical operation specified is incorrect\n");
    422                     return;
    423                 }
    424             }
    425         }
    426     }
    427     /*
    428         for (int iy = 0; iy < image->numRows; iy++) {
    429             for (int ix = 0; ix < image->numCols; ix++) {
    430                 if (ix + image->col0 >=  region.x0)
    431                     continue;
    432                 if (ix + image->col0 <= region.x1)
    433                     continue;
    434                 if (iy + image->row0 >=  region.y0)
    435                     continue;
    436                 if (iy + image->row0 <= region.y1)
    437                     continue;
    438                 if ( !strncmp(op, "&", 2) || !strncmp(op, "AND", 5) ) {
    439                     image->data.PS_TYPE_MASK_DATA[iy][ix] &= maskValue;
    440                 } else if ( !strncmp(op, "|", 2) || !strncmp(op, "OR", 5) ) {
    441                     image->data.PS_TYPE_MASK_DATA[iy][ix] |= maskValue;
    442                 } else if ( !strncmp(op, "=", 2) || !strncmp(op, "EQUAL", 5) ) {
    443                     image->data.PS_TYPE_MASK_DATA[iy][ix] = maskValue;
    444                 } else if ( !strncmp(op, "^", 2) || !strncmp(op, "XOR", 5) ) {
    445                     image->data.PS_TYPE_MASK_DATA[iy][ix] ^= maskValue;
    446                 }
    447             }
    448         }
    449     */
    450 }
    451 
    452 // mask the area not contained by the region
    453 // the region is defined wrt the parent image
    454 void psImageKeepRegion(psImage *image,
    455                        psRegion region,
    456                        const char *op,
    457                        psMaskType maskValue)
    458 {
    459     for (int j = 0; j < image->numRows; j++) {
    460         for (int i = 0; i < image->numCols; i++) {
    461             if ( (j + image->row0) < region.y0 ||
    462                     (j + image->row0) > region.y1 ||
    463                     (i + image->col0) < region.x0 ||
    464                     (i + image->col0) > region.x1 ) {
    465                 if ( !strncmp(op, "&", 2) || !strncmp(op, "AND", 5) ) {
    466                     image->data.PS_TYPE_MASK_DATA[j][i] &= maskValue;
    467                 } else if ( !strncmp(op, "|", 2) || !strncmp(op, "OR", 5) ) {
    468                     image->data.PS_TYPE_MASK_DATA[j][i] |= maskValue;
    469                 } else if ( !strncmp(op, "=", 2) || !strncmp(op, "EQUAL", 5) ) {
    470                     image->data.PS_TYPE_MASK_DATA[j][i] = maskValue;
    471                 } else if ( !strncmp(op, "^", 2) || !strncmp(op, "XOR", 5) ) {
    472                     image->data.PS_TYPE_MASK_DATA[j][i] ^= maskValue;
    473                 } else {
    474                     psError(PS_ERR_BAD_PARAMETER_VALUE,true,
    475                             "The logical operation specified is incorrect\n");
    476                     return;
    477                 }
    478             }
    479         }
    480     }
    481     /*
    482         for (int iy = 0; iy < image->numRows; iy++) {
    483             for (int ix = 0; ix < image->numCols; ix++) {
    484                 if (ix + image->col0 <  region.x0)
    485                     goto maskit;
    486                 if (ix + image->col0 > region.x1)
    487                     goto maskit;
    488                 if (iy + image->row0 <  region.y0)
    489                     goto maskit;
    490                 if (iy + image->row0 > region.y1)
    491                     goto maskit;
    492                 continue;
    493     maskit:
    494                 if ( !strncmp(op, "&", 2) || !strncmp(op, "AND", 5) ) {
    495                     image->data.PS_TYPE_MASK_DATA[iy][ix] &= maskValue;
    496                 } else if ( !strncmp(op, "|", 2) || !strncmp(op, "OR", 5) ) {
    497                     image->data.PS_TYPE_MASK_DATA[iy][ix] |= maskValue;
    498                 } else if ( !strncmp(op, "=", 2) || !strncmp(op, "EQUAL", 5) ) {
    499                     image->data.PS_TYPE_MASK_DATA[iy][ix] = maskValue;
    500                 } else if ( !strncmp(op, "^", 2) || !strncmp(op, "XOR", 5) ) {
    501                     image->data.PS_TYPE_MASK_DATA[iy][ix] ^= maskValue;
    502                 }
    503             }
    504         }
    505     */
    506 }
    507 
    508 // mask the area contained by the region
    509 // the region is defined wrt the parent image
    510 void psImageMaskCircle(psImage *image,
    511                        double x,
    512                        double y,
    513                        double radius,
    514                        const char *op,
    515                        psMaskType maskValue)
    516 {
    517     if (image == NULL) {
    518         psError(PS_ERR_BAD_PARAMETER_NULL, true,
    519                 "Invalid image input.  Image is NULL.\n");
    520         return;
    521     }
    522 
    523 
    524     double dx, dy, r2, R2;
    525 
    526     R2 = PS_SQR(radius);
    527 
    528     for (int iy = 0; iy < image->numRows; iy++) {
    529         for (int ix = 0; ix < image->numCols; ix++) {
    530             dx = ix + image->col0 - x;
    531             dy = iy + image->row0 - y;
    532             r2 = PS_SQR(dx) + PS_SQR(dy);
    533             if (r2 <= R2) {
    534                 if ( !strncmp(op, "&", 2) || !strncmp(op, "AND", 5) ) {
    535                     image->data.PS_TYPE_MASK_DATA[iy][ix] &= maskValue;
    536                 } else if ( !strncmp(op, "|", 2) || !strncmp(op, "OR", 5) ) {
    537                     image->data.PS_TYPE_MASK_DATA[iy][ix] |= maskValue;
    538                 } else if ( !strncmp(op, "=", 2) || !strncmp(op, "EQUAL", 5) ) {
    539                     image->data.PS_TYPE_MASK_DATA[iy][ix] = maskValue;
    540                 } else if ( !strncmp(op, "^", 2) || !strncmp(op, "XOR", 5) ) {
    541                     image->data.PS_TYPE_MASK_DATA[iy][ix] ^= maskValue;
    542                 } else {
    543                     psError(PS_ERR_BAD_PARAMETER_VALUE,true,
    544                             "The logical operation specified is incorrect\n");
    545                     return;
    546                 }
    547             }
    548         }
    549     }
    550 }
    551 
    552 // mask the area contained by the region
    553 // the region is defined wrt the parent image
    554 void psImageKeepCircle(psImage *image,
    555                        double x,
    556                        double y,
    557                        double radius,
    558                        const char *op,
    559                        psMaskType maskValue)
    560 {
    561 
    562     double dx, dy, r2, R2;
    563 
    564     R2 = PS_SQR(radius);
    565 
    566     for (int iy = 0; iy < image->numRows; iy++) {
    567         for (int ix = 0; ix < image->numCols; ix++) {
    568             dx = ix + image->col0 - x;
    569             dy = iy + image->row0 - y;
    570             r2 = PS_SQR(dx) + PS_SQR(dy);
    571             if (r2 > R2) {
    572                 if ( !strncmp(op, "&", 2) || !strncmp(op, "AND", 5) ) {
    573                     image->data.PS_TYPE_MASK_DATA[iy][ix] &= maskValue;
    574                 } else if ( !strncmp(op, "|", 2) || !strncmp(op, "OR", 5) ) {
    575                     image->data.PS_TYPE_MASK_DATA[iy][ix] |= maskValue;
    576                 } else if ( !strncmp(op, "=", 2) || !strncmp(op, "EQUAL", 5) ) {
    577                     image->data.PS_TYPE_MASK_DATA[iy][ix] = maskValue;
    578                 } else if ( !strncmp(op, "^", 2) || !strncmp(op, "XOR", 5) ) {
    579                     image->data.PS_TYPE_MASK_DATA[iy][ix] ^= maskValue;
    580                 } else {
    581                     psError(PS_ERR_BAD_PARAMETER_VALUE,true,
    582                             "The logical operation specified is incorrect\n");
    583                     return;
    584                 }
    585             }
    586         }
    587     }
    588 }
    589 
  • trunk/psLib/src/imageops/psImagePixelManip.h

    r5064 r5227  
    88 *  @author Robert DeSonia, MHPCC
    99 *
    10  *  @version $Revision: 1.13 $ $Name: not supported by cvs2svn $
    11  *  @date $Date: 2005-09-16 23:56:48 $
     10 *  @version $Revision: 1.14 $ $Name: not supported by cvs2svn $
     11 *  @date $Date: 2005-10-06 02:41:07 $
    1212 *
    1313 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    8787    const char *op                     ///< the operation to perform for overlay
    8888);
    89 /** Sets the bits inside the region, ignoring pixels outside.
    90  *
    91  *  The pixels are set by combining the existing pixel value and the given maskValue
    92  *  with a logical operation.  The allowed operations are =, AND, OR, and XOR.
    93  */
    94 void psImageMaskRegion(
    95     psImage *image,                    ///< the image to set
    96     psRegion region,                   ///< the specified region
    97     const char *op,                    ///< the logical operation
    98     psMaskType maskValue               ///< the specified bits
    99 );
    100 
    101 /** Sets the bits outside the region, ignoring pixels inside.
    102  *
    103  *  The pixels are set by combining the existing pixel value and the given maskValue
    104  *  with a logical operation.  The allowed operations are =, AND, OR, and XOR.
    105  */
    106 void psImageKeepRegion(
    107     psImage *image,                    ///< the image to set
    108     psRegion region,                   ///< the specified region
    109     const char *op,                    ///< the logical operation
    110     psMaskType maskValue               ///< the specified bits
    111 );
    112 
    113 /** Sets the bits inside the circle, ignoring the pixels outside.
    114  *
    115  *  The pixel values are set by combining the existing pixel value and the given maskValue
    116  *  with a logical operation.  The allowed operations are =, AND, OR, and XOR.
    117  */
    118 void psImageMaskCircle(
    119     psImage *image,                    ///< the image to set
    120     double x,                          ///< the x coordinate of the circle's center
    121     double y,                          ///< the y coordinate of the circle's center
    122     double radius,                     ///< the radius of the specified circle
    123     const char *op,                    ///< the logical operation
    124     psMaskType maskValue               ///< the specified bits
    125 );
    126 
    127 /** Sets the bits outside the circle, ignoring the pixels inside.
    128  *
    129  *  The pixel values are set by combining the existing pixel value and the given maskValue
    130  *  with a logical operation.  The allowed operations are =, AND, OR, and XOR.
    131  */
    132 void psImageKeepCircle(
    133     psImage *image,                    ///< the image to set
    134     double x,                          ///< the x coordinate of the circle's center
    135     double y,                          ///< the y coordinate of the circle's center
    136     double radius,                     ///< the radius of the specified circle
    137     const char *op,                    ///< the logical operation
    138     psMaskType maskValue               ///< the specified bits
    139 );
    14089
    14190#endif // #ifndef PS_IMAGE_PIXEL_MANIP_H
  • trunk/psLib/src/pslib_strict.h

    r4971 r5227  
    99*  @author Eric Van Alst, MHPCC
    1010*
    11 *  @version $Revision: 1.8 $ $Name: not supported by cvs2svn $
    12 *  @date $Date: 2005-09-08 00:15:15 $
     11*  @version $Revision: 1.9 $ $Name: not supported by cvs2svn $
     12*  @date $Date: 2005-10-06 02:41:07 $
    1313*
    1414*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    6262#include "psImageStats.h"
    6363#include "psImageStructManip.h"
     64#include "psImageMaskOps.h"
    6465/// @}
    6566
  • trunk/psLib/test/imageops/Makefile.am

    r4981 r5227  
    1111        tst_psImagePixelManip \
    1212        tst_psImageStats \
    13         tst_psImageStructManip
     13        tst_psImageStructManip \
     14    tst_psImageMaskOps
    1415
    1516tst_psImageConvolve_SOURCES =  tst_psImageConvolve.c
     
    2021tst_psImageStats_SOURCES =  tst_psImageStats.c
    2122tst_psImageStructManip_SOURCES =  tst_psImageStructManip.c
     23tst_psImageMaskOps_SOURCES = tst_psImageMaskOps.c
    2224
    2325check_DATA =
  • trunk/psLib/test/imageops/tst_psImagePixelManip.c

    r5224 r5227  
    66 *  @author Robert DeSonia, MHPCC
    77 *
    8  *  @version $Revision: 1.2 $ $Name: not supported by cvs2svn $
    9  *  @date $Date: 2005-10-05 03:51:43 $
     8 *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
     9 *  @date $Date: 2005-10-06 02:41:07 $
    1010 *
    1111 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    2929static psS32 testImageClipComplexRegion(void);
    3030static psS32 testImageOverlay(void);
    31 static psS32 testImageKeepMask(void);
    3231
    3332testDescription tests[] = {
     
    3635                              {testImageClipComplexRegion,673,"psImageClipComplexRegion",0,false},
    3736                              {testImageOverlay,573,"psImageOverlay",0,false},
    38                               {testImageKeepMask,574,"psImageKeep and Mask",0,false},
    3937                              {NULL}
    4038                          };
     
    798796    return 0;
    799797}
    800 
    801 psS32 testImageKeepMask(void)
    802 {
    803     //psImageMaskRegion
    804     //psImageKeepRegion
    805     //psImageMaskCircle
    806     //psImageKeepCircle
    807     psImage *in = psImageAlloc(3,3,PS_TYPE_MASK);
    808     psRegion reg;
    809     reg.x0 = 0;
    810     reg.x1 = 1;
    811     reg.y0 = 0;
    812     reg.y1 = 1;
    813     psMaskType mask = 2;
    814     in->data.PS_TYPE_MASK_DATA[0][0] = 2;
    815     in->data.PS_TYPE_MASK_DATA[0][1] = 0;
    816     in->data.PS_TYPE_MASK_DATA[0][2] = 1;
    817     in->data.PS_TYPE_MASK_DATA[1][0] = 4;
    818     in->data.PS_TYPE_MASK_DATA[1][1] = 0;
    819     in->data.PS_TYPE_MASK_DATA[1][2] = 3;
    820     in->data.PS_TYPE_MASK_DATA[2][0] = 2;
    821     in->data.PS_TYPE_MASK_DATA[2][1] = 1;
    822     in->data.PS_TYPE_MASK_DATA[2][2] = 2;
    823 
    824     printf("\n Mask Region------");
    825     psImageMaskRegion(in, reg, "|", mask);
    826     for(int i = 0; i < 3; i++) {
    827         for (int j = 0; j < 3; j++) {
    828             printf("\nin->data.u8 [i][j] i=%d, j=%d = %u", i, j, in->data.PS_TYPE_MASK_DATA[i][j]);
    829         }
    830     }
    831 
    832     in->data.PS_TYPE_MASK_DATA[0][0] = 2;
    833     in->data.PS_TYPE_MASK_DATA[0][1] = 0;
    834     in->data.PS_TYPE_MASK_DATA[0][2] = 1;
    835     in->data.PS_TYPE_MASK_DATA[1][0] = 4;
    836     in->data.PS_TYPE_MASK_DATA[1][1] = 0;
    837     in->data.PS_TYPE_MASK_DATA[1][2] = 3;
    838     in->data.PS_TYPE_MASK_DATA[2][0] = 2;
    839     in->data.PS_TYPE_MASK_DATA[2][1] = 1;
    840     in->data.PS_TYPE_MASK_DATA[2][2] = 2;
    841     psImageKeepRegion(in, reg, "AND", mask);
    842     printf("\n Keep Region------");
    843     for(int i = 0; i < 3; i++) {
    844         for (int j = 0; j < 3; j++) {
    845             printf("\nin->data.u8 [i][j] i=%d, j=%d = %u", i, j, in->data.PS_TYPE_MASK_DATA[i][j]);
    846         }
    847     }
    848 
    849     //Mask Circle and Keep Circle Functions
    850     in->data.PS_TYPE_MASK_DATA[0][0] = 2;
    851     in->data.PS_TYPE_MASK_DATA[0][1] = 0;
    852     in->data.PS_TYPE_MASK_DATA[0][2] = 1;
    853     in->data.PS_TYPE_MASK_DATA[1][0] = 4;
    854     in->data.PS_TYPE_MASK_DATA[1][1] = 0;
    855     in->data.PS_TYPE_MASK_DATA[1][2] = 3;
    856     in->data.PS_TYPE_MASK_DATA[2][0] = 2;
    857     in->data.PS_TYPE_MASK_DATA[2][1] = 1;
    858     in->data.PS_TYPE_MASK_DATA[2][2] = 2;
    859     psImageMaskCircle(in, 1, 1, 1, "XOR", mask);
    860     printf("\n Mask Circle------");
    861     for(int i = 0; i < 3; i++) {
    862         for (int j = 0; j < 3; j++) {
    863             printf("\nin->data.u8 [i][j] i=%d, j=%d = %u", i, j, in->data.PS_TYPE_MASK_DATA[i][j]);
    864         }
    865     }
    866 
    867     in->data.PS_TYPE_MASK_DATA[0][0] = 2;
    868     in->data.PS_TYPE_MASK_DATA[0][1] = 0;
    869     in->data.PS_TYPE_MASK_DATA[0][2] = 1;
    870     in->data.PS_TYPE_MASK_DATA[1][0] = 4;
    871     in->data.PS_TYPE_MASK_DATA[1][1] = 0;
    872     in->data.PS_TYPE_MASK_DATA[1][2] = 3;
    873     in->data.PS_TYPE_MASK_DATA[2][0] = 2;
    874     in->data.PS_TYPE_MASK_DATA[2][1] = 1;
    875     in->data.PS_TYPE_MASK_DATA[2][2] = 2;
    876     psImageKeepCircle(in, 1, 1, 1, "=", mask);
    877     printf("\n Keep Circle------");
    878     for(int i = 0; i < 3; i++) {
    879         for (int j = 0; j < 3; j++) {
    880             printf("\nin->data.u8 [i][j] i=%d, j=%d = %u", i, j, in->data.PS_TYPE_MASK_DATA[i][j]);
    881         }
    882     }
    883     fflush(stdout);
    884 
    885     //Error Checks
    886     //incorrect logical operation
    887     printf("\n");
    888     psImageKeepRegion(in, reg, "+", mask);
    889     //null image
    890     psImage *none = NULL;
    891     psImageMaskCircle(none, 1, 1, 1, "&", mask);
    892 
    893     psFree(in);
    894     return 0;
    895 }
    896 
  • trunk/psLib/test/imageops/verified/tst_psImagePixelManip.stderr

    r5224 r5227  
    147147---> TESTPOINT PASSED (psImage{psImageOverlay} | tst_psImagePixelManip.c)
    148148
    149 /***************************** TESTPOINT ******************************************\
    150 *             TestFile: tst_psImagePixelManip.c                                    *
    151 *            TestPoint: psImage{psImageKeep and Mask}                              *
    152 *             TestType: Positive                                                   *
    153 \**********************************************************************************/
    154 
    155 <DATE><TIME>|<HOST>|E|psImageKeepRegion (FILE:LINENO)
    156     The logical operation specified is incorrect
    157 <DATE><TIME>|<HOST>|E|psImageMaskCircle (FILE:LINENO)
    158     Invalid image input.  Image is NULL.
    159 
    160 ---> TESTPOINT PASSED (psImage{psImageKeep and Mask} | tst_psImagePixelManip.c)
    161 
Note: See TracChangeset for help on using the changeset viewer.