int main(int argc, char **argv) { char optList[] = "b:hv"; int option; int verboseFlg=0; WlzBinaryOperatorType operator = WLZ_BO_ADD; FILE *inFile; double val; WlzPixelV pval; WlzObject *obj, *obj1; WlzErrorNum errNum; /* read the argument list and check for an input file */ opterr = 0; while( (option = getopt(argc, argv, optList)) != EOF ){ switch( option ){ case 'b': operator = atoi(optarg); switch( operator ){ case WLZ_BO_ADD: case WLZ_BO_SUBTRACT: case WLZ_BO_MULTIPLY: case WLZ_BO_DIVIDE: case WLZ_BO_MODULUS: case WLZ_BO_EQ: case WLZ_BO_NE: case WLZ_BO_GT: case WLZ_BO_GE: case WLZ_BO_LT: case WLZ_BO_LE: case WLZ_BO_AND: case WLZ_BO_OR: case WLZ_BO_XOR: case WLZ_BO_MAX: case WLZ_BO_MIN: case WLZ_BO_MAGNITUDE: break; default: usage(argv[0]); return( 1 ); } break; case 'v': verboseFlg = 1; break; case 'h': default: usage(argv[0]); return( 1 ); } } /* get the scalar value */ switch( operator ){ case WLZ_BO_ADD: case WLZ_BO_SUBTRACT: case WLZ_BO_MULTIPLY: case WLZ_BO_DIVIDE: case WLZ_BO_MODULUS: case WLZ_BO_EQ: case WLZ_BO_NE: case WLZ_BO_GT: case WLZ_BO_GE: case WLZ_BO_LT: case WLZ_BO_LE: case WLZ_BO_AND: case WLZ_BO_OR: case WLZ_BO_XOR: case WLZ_BO_MAX: case WLZ_BO_MIN: if( optind < argc ){ val = atof(*(argv+optind)); pval.type = WLZ_GREY_DOUBLE; pval.v.dbv = val; optind++; } break; case WLZ_BO_MAGNITUDE: break; } /* get the file pointer */ inFile = stdin; if( optind < argc ){ 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 ); } } /* process objects */ while( (obj = WlzReadObj(inFile, NULL)) != NULL ) { if( WlzGreyTypeFromObj(obj, &errNum) == WLZ_GREY_RGBA ){ obj1 = WlzRGBAScalarBinaryOp(obj, pval, operator, &errNum); WlzWriteObj(stdout, obj1); WlzFreeObj(obj1); } else { WlzScalarBinaryOp(obj, pval, obj, operator); WlzWriteObj(stdout, obj); WlzFreeObj(obj); } } return 0; }
/*! * \return Object with transformed grey-values. * \ingroup WlzArithmetic * \brief Apply a binary operation (add subtract etc) to * each pixel value in the given object. The operand value * is in <tt>pval</tt>. * \param o1 Input object * \param pval Pixel value for binary operation. * \param op Opertor * \param dstErr Error return. * \par Source: * WlzScalarArithmeticOp.c */ WlzObject *WlzScalarBinaryOp2( WlzObject *o1, WlzPixelV pval, WlzBinaryOperatorType op, WlzErrorNum *dstErr) { WlzObject *obj=NULL, *tmp3; WlzErrorNum errNum=WLZ_ERR_NONE; WlzValues values; WlzPixelV old_bckgrnd, new_bckgrnd; WlzGreyType new_grey_type; int p; /* check object pointers */ if( (o1 == NULL) ){ errNum = WLZ_ERR_OBJECT_NULL; } /* check object types - WLZ_EMPTY_OBJ is legal */ if( errNum == WLZ_ERR_NONE ){ switch( o1->type ){ case WLZ_2D_DOMAINOBJ: /* FALLTHROUGH */ case WLZ_3D_DOMAINOBJ: /* FALLTHROUGH */ case WLZ_TRANS_OBJ: break; case WLZ_EMPTY_OBJ: obj = WlzMakeEmpty(&errNum); break; default: errNum = WLZ_ERR_OBJECT_TYPE; break; } } /* check domains and valuetables */ if( (errNum == WLZ_ERR_NONE) && (obj == NULL) ){ switch( o1->type ){ case WLZ_2D_DOMAINOBJ: if( (o1->domain.core == NULL) ){ errNum = WLZ_ERR_DOMAIN_NULL; break; } if( (o1->values.core == NULL) ){ errNum = WLZ_ERR_VALUES_NULL; break; } break; case WLZ_3D_DOMAINOBJ: if( (o1->domain.core == NULL) ){ errNum = WLZ_ERR_DOMAIN_NULL; break; } if( (o1->domain.p->type != WLZ_PLANEDOMAIN_DOMAIN) ){ errNum = WLZ_ERR_PLANEDOMAIN_TYPE; break; } if( (o1->values.core == NULL) ){ errNum = WLZ_ERR_VALUES_NULL; break; } if( (o1->values.vox->type != WLZ_VOXELVALUETABLE_GREY) ){ errNum = WLZ_ERR_VOXELVALUES_TYPE; break; } break; case WLZ_TRANS_OBJ: if( (o1->domain.core == NULL) ){ errNum = WLZ_ERR_DOMAIN_NULL; break; } if( (o1->values.core == NULL) ){ errNum = WLZ_ERR_VALUES_NULL; break; } if((values.obj = WlzScalarBinaryOp2(o1->values.obj, pval, op, &errNum)) != NULL){ obj = WlzMakeMain(WLZ_TRANS_OBJ, o1->domain, values, NULL, NULL, &errNum); break; } break; default: errNum = WLZ_ERR_OBJECT_TYPE; break; } } /* set up temporary object */ if((errNum == WLZ_ERR_NONE) && (obj == NULL)){ switch( o1->type ){ case WLZ_2D_DOMAINOBJ: values.core = NULL; if( (tmp3 = WlzMakeMain(WLZ_2D_DOMAINOBJ, o1->domain, values, NULL, NULL, &errNum)) == NULL ){ break; } old_bckgrnd = WlzGetBackground(o1, NULL); switch( WlzGreyTableTypeToGreyType(o1->values.core->type, NULL) ){ case WLZ_GREY_INT: /* FALLTHROUGH */ case WLZ_GREY_SHORT: /* FALLTHROUGH */ case WLZ_GREY_FLOAT: /* FALLTHROUGH */ case WLZ_GREY_DOUBLE: new_grey_type = WlzGreyTableTypeToGreyType(o1->values.core->type, NULL); new_bckgrnd = old_bckgrnd; break; case WLZ_GREY_UBYTE: new_grey_type = WLZ_GREY_SHORT; new_bckgrnd.type = WLZ_GREY_SHORT; new_bckgrnd.v.shv = old_bckgrnd.v.ubv; break; default: errNum = WLZ_ERR_OBJECT_TYPE; break; } if(errNum == WLZ_ERR_NONE){ values.v = WlzNewValueTb(tmp3, WlzGreyTableType(WLZ_GREY_TAB_RAGR, new_grey_type, NULL), new_bckgrnd, &errNum); tmp3->values = WlzAssignValues( values, NULL ); } break; case WLZ_3D_DOMAINOBJ: values.core = NULL; if((tmp3 = WlzMakeMain(WLZ_3D_DOMAINOBJ, o1->domain, values, NULL, NULL, &errNum)) == NULL){ break; } /* now a new destination voxeltable */ old_bckgrnd = WlzGetBackground(o1, NULL); switch( old_bckgrnd.type ){ case WLZ_GREY_INT: /* FALLTHROUGH */ case WLZ_GREY_SHORT: /* FALLTHROUGH */ case WLZ_GREY_FLOAT: /* FALLTHROUGH */ case WLZ_GREY_DOUBLE: new_grey_type = old_bckgrnd.type; new_bckgrnd = old_bckgrnd; break; case WLZ_GREY_UBYTE: new_grey_type = WLZ_GREY_SHORT; new_bckgrnd.type = WLZ_GREY_SHORT; new_bckgrnd.v.shv = old_bckgrnd.v.ubv; break; default: errNum = WLZ_ERR_GREY_TYPE; break; } if(errNum == WLZ_ERR_NONE){ values.vox = WlzMakeVoxelValueTb(WLZ_VOXELVALUETABLE_GREY, tmp3->domain.p->plane1, tmp3->domain.p->lastpl, new_bckgrnd, NULL, &errNum); if( values.vox == NULL ){break;} for(p=tmp3->domain.p->plane1; p <= tmp3->domain.p->lastpl; p++){ WlzValues values2d; /* currently test for NULL domain to imply WLZ_EMPTY_DOMAIN */ if( tmp3->domain.p->domains[p-tmp3->domain.p->plane1].core == NULL ){ values2d.core = NULL; } else { WlzObject *tmp2d; values2d.core = NULL; if((tmp2d = WlzMakeMain(WLZ_2D_DOMAINOBJ, tmp3->domain.p->domains[p-tmp3->domain.p->plane1], values2d, NULL, NULL, &errNum)) != NULL){ values2d.v = WlzNewValueTb( tmp2d, WlzGreyTableType(WLZ_GREY_TAB_RAGR, new_grey_type, NULL), new_bckgrnd, &errNum); WlzFreeObj( tmp2d ); } } values.vox->values[p-tmp3->domain.p->plane1] = WlzAssignValues(values2d, NULL); } tmp3->values = WlzAssignValues(values, NULL); } break; default: errNum = WLZ_ERR_OBJECT_TYPE; break; } } /* apply operation and free space */ if((errNum == WLZ_ERR_NONE) && (obj == NULL)){ if((errNum = WlzScalarBinaryOp(o1, pval, tmp3, op)) != WLZ_ERR_NONE){ WlzFreeObj( tmp3 ); } else { obj = tmp3; } } if( dstErr ){ *dstErr = errNum; } return obj; }