/*! * \return New object with the same domain as the input object or * NULL on error. * \ingroup LibWlzBnd * \brief Wrapper avoiding pixel type for WlzGreyMask() which * sets the value maskVal within the domain given by the * mask object. The mask object can be a 2D, 3D, polygon * or boundary object. A 3D mask with a 2D object is an * error. A 2D mask with a 3D object will be applied to * each plane in turn. * See also WlzMakeCuboidI(). * \param obj Input object * \param mask Mask object. * \param maskVal Double mask value. * \param dstErr Destination error pointer, may be NULL. */ WlzObject *WlzGreyMaskD( WlzObject *obj, WlzObject *mask, double maskVal, WlzErrorNum *dstErr) { WlzObject *rObj = NULL; WlzPixelV maskV; maskV.type = WLZ_GREY_DOUBLE; maskV.v.dbv = maskVal; rObj = WlzGreyMask(obj, mask, maskV, dstErr); return(rObj); }
/*! * \return New object with the same domain as the input object or * NULL on error. * \ingroup LibWlzBnd * \brief Wrapper avoiding pixel type for WlzGreyMask() which * sets the value maskVal within the domain given by the * mask object. The mask object can be a 2D, 3D, polygon * or boundary object. A 3D mask with a 2D object is an * error. A 2D mask with a 3D object will be applied to * each plane in turn. * See also WlzMakeCuboidD(). * \param obj Input object * \param mask Mask object. * \param maskVal Integer mask value. * \param dstErr Destination error pointer, may be NULL. */ WlzObject *WlzGreyMaskI( WlzObject *obj, WlzObject *mask, int maskVal, WlzErrorNum *dstErr) { WlzObject *rObj = NULL; WlzPixelV maskV; maskV.type = WLZ_GREY_INT; maskV.v.inv = maskVal; rObj = WlzGreyMask(obj, mask, maskV, dstErr); return(rObj); }
int main(int argc, char **argv) { WlzObject *obj, *mask, *newobj; FILE *inFile = NULL; char optList[] = "m:hv"; int option; WlzPixelV maskVal; int verboseFlg=0; WlzErrorNum errNum = WLZ_ERR_NONE; const char *errMsg; /* read the argument list and check for an input file */ opterr = 0; maskVal.type = WLZ_GREY_FLOAT; maskVal.v.flv = 0.0; while( (option = getopt(argc, argv, optList)) != EOF ){ switch( option ){ case 'm': maskVal.v.flv = atof(optarg); break; case 'v': verboseFlg = 1; break; case 'h': default: usage(argv[0]); return 1; } } /* check for read from file, note if one file is defined then it is the mask and the object should be on stdin */ if( (argc - optind) >= 2 ){ /* read the mask */ if( (inFile = fopen(*(argv+optind), "r")) == NULL ){ fprintf(stderr, "%s: can't open file %s\n", argv[0], *(argv+optind)); usage(argv[0]); return 1; } if( (mask = WlzAssignObject(WlzReadObj(inFile, NULL), NULL)) == NULL ){ fprintf(stderr, "%s: can't read mask from file %s\n", argv[0], *(argv+optind)); usage(argv[0]); return 1; } fclose( inFile ); optind++; /* read the object */ if( (inFile = fopen(*(argv+optind), "r")) == NULL ){ fprintf(stderr, "%s: can't open file %s\n", argv[0], *(argv+optind)); usage(argv[0]); return 1; } if( (obj = WlzAssignObject(WlzReadObj(inFile, NULL), NULL)) == NULL ){ fprintf(stderr, "%s: can't read obj from file %s\n", argv[0], *(argv+optind)); usage(argv[0]); return 1; } fclose( inFile ); } else if( (argc - optind) == 1 ){ /* read the mask */ if( (inFile = fopen(*(argv+optind), "r")) == NULL ){ fprintf(stderr, "%s: can't open file %s\n", argv[0], *(argv+optind)); usage(argv[0]); return 1; } if( (mask = WlzAssignObject(WlzReadObj(inFile, NULL), NULL)) == NULL ){ fprintf(stderr, "%s: can't read mask from file %s\n", argv[0], *(argv+optind)); usage(argv[0]); return 1; } fclose( inFile ); inFile = stdin; if( (obj = WlzAssignObject(WlzReadObj(inFile, NULL), NULL)) == NULL ){ fprintf(stderr, "%s: can't read obj from stdin\n", argv[0]); usage(argv[0]); return 1; } } else { /* else read objects from stdin */ if( (obj = WlzAssignObject(WlzReadObj(inFile, NULL), NULL)) == NULL ){ fprintf(stderr, "%s: can't read obj from stdin\n", argv[0]); usage(argv[0]); return 1; } if( (mask = WlzAssignObject(WlzReadObj(inFile, NULL), NULL)) == NULL ){ fprintf(stderr, "%s: can't read mask from stdin\n", argv[0]); usage(argv[0]); return 1; } } /* apply mask and write resultant object */ if((newobj = WlzGreyMask(obj, mask, maskVal, &errNum)) != NULL){ if((errNum = WlzWriteObj(stdout, newobj)) != WLZ_ERR_NONE) { (void )WlzStringFromErrorNum(errNum, &errMsg); (void )fprintf(stderr, "%s: failed to write object (%s).\n", argv[0], errMsg); return(1); } WlzFreeObj(newobj); } WlzFreeObj(mask); WlzFreeObj(obj); return 0; }
/*! * \ingroup WlzValuesUtils * \brief Set the value maskVal within the domain given by the * mask object. The mask object can be a 2D, 3D, polygon * or boundary object. A 3D mask with a 2D object is an * error. A 2D mask with a 3D object will be applied to * each plane in turn. * * \return New object with the same domain as the input object but with values in the intersection with the mask domain set to the mask value. NULL on error. * \param obj Input object * \param mask Mask object. * \param maskVal mask value. * \param dstErr Error return. * \par Source: * WlzGreyMask.c */ WlzObject *WlzGreyMask( WlzObject *obj, WlzObject *mask, WlzPixelV maskVal, WlzErrorNum *dstErr) { WlzObject *rtnObj=NULL; WlzObject *tmpMask, *obj1; WlzValues values; WlzPixelV tmpMaskval; WlzIntervalWSpace iwsp; WlzGreyWSpace gwsp; WlzGreyP gptr; int i; WlzErrorNum errNum=WLZ_ERR_NONE; /* check obj */ if( obj == NULL ){ errNum = WLZ_ERR_OBJECT_NULL; } else { switch( obj->type ){ case WLZ_2D_DOMAINOBJ: if( obj->values.core == NULL ){ errNum = WLZ_ERR_VALUES_NULL; } break; case WLZ_3D_DOMAINOBJ: return WlzGreyMask3d(obj, mask, maskVal, dstErr); case WLZ_TRANS_OBJ: if((values.obj = WlzGreyMask(obj->values.obj, mask, maskVal, &errNum)) != NULL){ return WlzMakeMain(WLZ_TRANS_OBJ, obj->domain, values, NULL, NULL, dstErr); } break; case WLZ_EMPTY_OBJ: return WlzMakeEmpty(dstErr); default: errNum = WLZ_ERR_OBJECT_TYPE; break; } } /* check the mask */ if( errNum == WLZ_ERR_NONE ){ if( mask == NULL ){ errNum = WLZ_ERR_OBJECT_NULL; } else { values.core = NULL; switch( mask->type ){ case WLZ_2D_DOMAINOBJ: tmpMask = WlzMakeMain(WLZ_2D_DOMAINOBJ, mask->domain, values, NULL, NULL, &errNum); break; case WLZ_TRANS_OBJ: tmpMask = WlzMakeMain(WLZ_2D_DOMAINOBJ, mask->values.obj->domain, values, NULL, NULL, &errNum); break; case WLZ_EMPTY_OBJ: return WlzMakeMain(WLZ_2D_DOMAINOBJ, obj->domain, obj->values, NULL, NULL, dstErr); case WLZ_2D_POLYGON: tmpMask = WlzPolyToObj(mask->domain.poly, WLZ_SIMPLE_FILL, &errNum); break; case WLZ_BOUNDLIST: tmpMask = WlzBoundToObj(mask->domain.b, WLZ_SIMPLE_FILL, &errNum); break; default: errNum = WLZ_ERR_OBJECT_TYPE; break; } if( errNum == WLZ_ERR_NONE ){ tmpMask = WlzAssignObject(tmpMask, NULL); } } } /* copy input obj and setvalues in the intersection */ if(errNum == WLZ_ERR_NONE){ if((rtnObj = WlzNewGrey(obj, &errNum)) != NULL){ if((obj1 = WlzIntersect2(obj, tmpMask, &errNum)) != NULL){ obj1->values = WlzAssignValues(rtnObj->values, NULL); errNum = WlzInitGreyScan(obj1, &iwsp, &gwsp); WlzValueConvertPixel(&tmpMaskval, maskVal, gwsp.pixeltype); while((errNum == WLZ_ERR_NONE) && ((errNum = WlzNextGreyInterval(&iwsp)) == WLZ_ERR_NONE)){ gptr = gwsp.u_grintptr; switch( gwsp.pixeltype ){ case WLZ_GREY_INT: for(i=0; i<iwsp.colrmn; i++, gptr.inp++){ *gptr.inp = tmpMaskval.v.inv; } break; case WLZ_GREY_SHORT: for(i=0; i<iwsp.colrmn; i++, gptr.shp++){ *gptr.shp = tmpMaskval.v.shv; } break; case WLZ_GREY_UBYTE: for(i=0; i<iwsp.colrmn; i++, gptr.ubp++){ *gptr.ubp = tmpMaskval.v.ubv; } break; case WLZ_GREY_FLOAT: for(i=0; i<iwsp.colrmn; i++, gptr.flp++){ *gptr.flp = tmpMaskval.v.flv; } break; case WLZ_GREY_DOUBLE: for(i=0; i<iwsp.colrmn; i++, gptr.dbp++){ *gptr.dbp = tmpMaskval.v.dbv; } break; case WLZ_GREY_RGBA: for(i=0; i<iwsp.colrmn; i++, gptr.rgbp++){ *gptr.rgbp = tmpMaskval.v.rgbv; } break; default: errNum = WLZ_ERR_GREY_TYPE; break; } } if( errNum == WLZ_ERR_EOO ){ errNum = WLZ_ERR_NONE; } WlzFreeObj(obj1); } else { WlzFreeObj(rtnObj); rtnObj = NULL; } } WlzFreeObj(tmpMask); } if( dstErr ){ *dstErr = errNum; } return rtnObj; }
static WlzObject *WlzGreyMask3d( WlzObject *obj, WlzObject *mask, WlzPixelV maskVal, WlzErrorNum *dstErr) { WlzObject *rtnObj=NULL; WlzObject *tmpMask, *obj1, *obj2; WlzDomain *domains; WlzValues values, *valuess, *newvaluess; WlzPlaneDomain *pdom; int p; WlzErrorNum errNum=WLZ_ERR_NONE; /* check the object - it is non-NULL and 3D but the domain needs checking */ if( obj->domain.p == NULL ){ errNum = WLZ_ERR_DOMAIN_NULL; } else { switch( obj->domain.p->type ){ case WLZ_2D_DOMAINOBJ: /* check there is a valuetable */ if( obj->values.core == NULL ){ errNum = WLZ_ERR_VALUES_NULL; } break; case WLZ_EMPTY_DOMAIN: return WlzMakeEmpty(dstErr); default: errNum = WLZ_ERR_DOMAIN_TYPE; break; } } /* check the mask */ if( errNum == WLZ_ERR_NONE ){ if( mask == NULL ){ errNum = WLZ_ERR_OBJECT_NULL; } else { /* set some local variables */ pdom = obj->domain.p; domains = obj->domain.p->domains; valuess = obj->values.vox->values; /* create a new voxel object, initially no values */ values.vox = WlzMakeVoxelValueTb(obj->values.vox->type, obj->values.vox->plane1, obj->values.vox->lastpl, obj->values.vox->bckgrnd, obj, NULL); rtnObj = WlzMakeMain(WLZ_3D_DOMAINOBJ, obj->domain, values, NULL, NULL, NULL); newvaluess = rtnObj->values.vox->values; /* switch on mask type - a 2D mask is applied to each plane */ switch( mask->type ){ case WLZ_2D_DOMAINOBJ: case WLZ_2D_POLYGON: case WLZ_BOUNDLIST: case WLZ_EMPTY_OBJ: for(p=pdom->plane1; p <= pdom->lastpl; p++, domains++, valuess++){ if( (*domains).core ){ obj1 = WlzAssignObject( WlzMakeMain(WLZ_2D_DOMAINOBJ, *domains, *valuess, NULL, NULL, NULL), NULL); if((obj2 = WlzGreyMask(obj1, mask, maskVal, &errNum)) != NULL){ newvaluess[p - pdom->plane1] = WlzAssignValues(obj->values, NULL); WlzFreeObj(obj2); } WlzFreeObj(obj1); } } break; case WLZ_3D_DOMAINOBJ: /* switch on plane domain type - polygon and boundlist are legal but need transforming first. */ switch( obj->domain.p->type ){ WlzDomain *maskDoms; case WLZ_PLANEDOMAIN_DOMAIN: maskDoms = mask->domain.p->domains; for(p=pdom->plane1; p <= pdom->lastpl; p++, domains++, valuess++){ if(((*domains).core)){ if((p >= mask->domain.p->plane1) && (p <= mask->domain.p->lastpl) && (maskDoms[p - mask->domain.p->plane1].core) ){ values.core = NULL; tmpMask = WlzMakeMain(WLZ_2D_DOMAINOBJ, maskDoms[p - mask->domain.p->plane1], values, NULL, NULL, NULL); } else { tmpMask = WlzMakeEmpty(NULL); } obj1 = WlzAssignObject( WlzMakeMain(WLZ_2D_DOMAINOBJ, *domains, *valuess, NULL, NULL, NULL), NULL); if((obj2 = WlzGreyMask(obj1, tmpMask, maskVal, &errNum)) != NULL){ newvaluess[p - pdom->plane1] = WlzAssignValues(obj2->values, NULL); WlzFreeObj(obj2); } WlzFreeObj(obj1); WlzFreeObj(tmpMask); } } break; case WLZ_PLANEDOMAIN_POLYGON: maskDoms = mask->domain.p->domains; for(p=pdom->plane1; p <= pdom->lastpl; p++, domains++, valuess++){ if(((*domains).core)){ if((p >= mask->domain.p->plane1) && (p <= mask->domain.p->lastpl) && (maskDoms[p - mask->domain.p->plane1].core) ){ values.core = NULL; tmpMask = WlzMakeMain(WLZ_2D_POLYGON, maskDoms[p - mask->domain.p->plane1], values, NULL, NULL, NULL); } else { tmpMask = WlzMakeEmpty(NULL); } obj1 = WlzAssignObject( WlzMakeMain(WLZ_2D_DOMAINOBJ, *domains, *valuess, NULL, NULL, NULL), NULL); if((obj2 = WlzGreyMask(obj1, tmpMask, maskVal, &errNum)) != NULL){ newvaluess[p - pdom->plane1] = WlzAssignValues(obj2->values, NULL); WlzFreeObj(obj2); } WlzFreeObj(obj1); WlzFreeObj(tmpMask); } } break; case WLZ_PLANEDOMAIN_BOUNDLIST: maskDoms = mask->domain.p->domains; for(p=pdom->plane1; p <= pdom->lastpl; p++, domains++, valuess++){ if(((*domains).core)){ if((p >= mask->domain.p->plane1) && (p <= mask->domain.p->lastpl) && (maskDoms[p - mask->domain.p->plane1].core) ){ values.core = NULL; tmpMask = WlzMakeMain(WLZ_BOUNDLIST, maskDoms[p - mask->domain.p->plane1], values, NULL, NULL, NULL); } else { tmpMask = WlzMakeEmpty(NULL); } obj1 = WlzAssignObject( WlzMakeMain(WLZ_2D_DOMAINOBJ, *domains, *valuess, NULL, NULL, NULL), NULL); if((obj2 = WlzGreyMask(obj1, tmpMask, maskVal, &errNum)) != NULL){ newvaluess[p - pdom->plane1] = WlzAssignValues(obj2->values, NULL); WlzFreeObj(obj2); } WlzFreeObj(obj1); WlzFreeObj(tmpMask); } } break; default: errNum = WLZ_ERR_DOMAIN_TYPE; WlzFreeObj(rtnObj); rtnObj = NULL; break; } break; default: errNum = WLZ_ERR_OBJECT_NULL; WlzFreeObj(rtnObj); rtnObj = NULL; break; } } } if( dstErr ){ *dstErr = errNum; } return rtnObj; }