Woolz Image Processing
Version 1.7.5
|
Modules | |
WlzScalarBinaryOp | |
Files | |
file | Wlz2DContains.c |
Takes a WLZ_2D_DOMAINOBJ, calls WlzLabel to split the domain and returns the one containing point(x,y). | |
file | WlzIntersect2.c |
Calculates the intersection between two domain objects. | |
file | WlzIntersect3d.c |
Intersection (set intersection) routines for domain objects. | |
file | WlzIntersectN.c |
Intersection of N woolz domain objects. | |
file | WlzLabel.c |
Segments a domain object into disconnected regions. | |
file | WlzLabel3D.c |
3D labeling (segmention). | |
file | WlzRegConCalc.c |
Computes region connected calculus spatial classifications. | |
file | WlzSplitObj.c |
Functions to split a single object into component objects. | |
file | WlzUnion2.c |
Convenience function to calculate the union of two domain objects. | |
file | WlzUnion3d.c |
Computes the set union of 3D objects. | |
file | WlzUnionN.c |
Computes the set union of N objects. | |
Functions | |
WlzObject * | Wlz2DContains (WlzObject *obj, double x, double y, WlzErrorNum *dstErr) |
Takes a WLZ_2D_DOMAINOBJ, calls WlzLabel to split the domain and returns the one containing point(x,y). More... | |
WlzObject * | WlzIntersect2 (WlzObject *obj1, WlzObject *obj2, WlzErrorNum *dstErr) |
Calculate the set intersection between two domain objects. This is a convenience routine calling WlzIntersectN with uvt=0. Input objects must be domain objects of the same type (2D or 3D) and non-NULL. Type WLZ_EMPTY_OBJ is legal, clearly an empty domain will be returned. More... | |
WlzObject * | WlzIntersect3d (WlzObject **objs, int n, int uvt, WlzErrorNum *wlzErr) |
Calculate the intersection betweena a list of 3D objects. Should not be used directly but is intended as a static procedure called from WlzIntersectN(). More... | |
WlzObject * | WlzIntersectN (int n, WlzObject **objs, int uvt, WlzErrorNum *dstErr) |
Calculate the intersection of a set of objects. If uvt=0 calculate domain only, uvt=1 calculate the mmean grey-value at each point. Input objects must be all non-NULL and domain objects of the same type i.e. either 2D or 3D otherwise an error is returned. More... | |
WlzErrorNum | WlzLabel (WlzObject *obj, int *mm, WlzObject ***dstArrayObjs, int maxNumObjs, int ignlns, WlzConnectType connect) |
Segments a domain into connected parts. Connectivity is defined by the connect parameter and can be 4- or 8-connected for 2D objects and 6-, 18- or 26-connected for 3D objects. Note this version requires that there is sufficient space in the objects array defined by maxNumObjs and this is not extended. This should be changed in future so that the array is extended as required. More... | |
WlzObject * | WlzLabel3D (WlzObject *gObj, int maxObj, int ignLn, WlzConnectType con, WlzErrorNum *dstErr) |
Labels (segments) a 3D domain object into connected component objects using their connectivity. More... | |
WlzRCCClass | WlzRegConCalcRCC (WlzObject *obj0, WlzObject *obj1, int noEnc, int noOst, int maxOstDist, int *dstStatCnt, double **dstStatAry, WlzErrorNum *dstErr) |
The given pair of spatial domain objects are classified using a RCC with optional enclosure and offset classifications. More... | |
WlzErrorNum | WlzSplitObj (WlzObject *refObj, WlzObject *ppObj, int bWidth, double bgdFrac, double sigma, WlzCompThreshType compThrMethod, int nReqComp, int *dstNComp, WlzObject ***dstComp) |
Splits the reference object into component objects cliped from the reference object, with the bounding box of each of the component objects determined using the pre-processed object. The component objects are returned in size order. More... | |
WlzErrorNum | WlzSplitMontageObj (WlzObject *mObj, WlzPixelV gapV, double tol, int bWidth, WlzLong minArea, int maxComp, int *dstNComp, WlzObject ***dstComp) |
Splits the given montage object into component objects clipped from the montage object. The montage object must be composed of component images embedded in a background, with little variation in the background values. More... | |
WlzObject * | WlzUnion2 (WlzObject *obj1, WlzObject *obj2, WlzErrorNum *dstErr) |
Convenience procedure to calculate the union of two woolz domain objects. This calls WlzUnnionN() with uvt=0. Objects must be of the same type. More... | |
WlzObject * | WlzUnion3d (int n, WlzObject **objs, int uvt, WlzErrorNum *dstErr) |
Private routine used by WlzUnionN() for 3D objects. More... | |
WlzObject * | WlzUnionN (int n, WlzObject **objs, int uvt, WlzErrorNum *dstErr) |
Calculate the set union of an array of domain objects. Domians only unless uvt non-zero in which case make an average grey table. Note background values are used in the averaging process. All objects must be domain objects of the same type (2D or 3D) unless WLZ_EMPTY_OBJ, NULL input objects are an error. More... | |
WlzObject* Wlz2DContains | ( | WlzObject * | obj, |
double | x, | ||
double | y, | ||
WlzErrorNum * | dstErr | ||
) |
Takes a WLZ_2D_DOMAINOBJ, calls WlzLabel to split the domain and returns the one containing point(x,y).
obj | Given WLZ_2D_DOMAINOBJ object. |
x | Column coordinate. |
y | Line coordinate. |
dstErr | Destination error code pointer, may be NULL. |
References _WlzObject::type, WLZ_2D_DOMAINOBJ, WLZ_8_CONNECTED, WLZ_ERR_NONE, WlzCopyObject(), WlzFreeObj(), WlzInsideDomain(), and WlzLabel().
WlzObject* WlzIntersect2 | ( | WlzObject * | obj1, |
WlzObject * | obj2, | ||
WlzErrorNum * | dstErr | ||
) |
Calculate the set intersection between two domain objects. This is a convenience routine calling WlzIntersectN with uvt=0. Input objects must be domain objects of the same type (2D or 3D) and non-NULL. Type WLZ_EMPTY_OBJ is legal, clearly an empty domain will be returned.
obj1 | first input object |
obj2 | second input object |
dstErr | error return. |
References WlzIntersectN().
Referenced by WlzCCorS2D(), WlzConComThreshold(), WlzDistanceTransform(), WlzDomainFill3D(), WlzGreyMask(), WlzGreyMeanDifference(), WlzGreyTemplate(), WlzGreyTransfer(), WlzHyThreshold(), WlzImageArithmetic(), WlzInteriority(), WlzOffsetDist(), WlzPatchTreeToObject(), WlzProj3DToSection(), WlzRegConCalcRCC(), WlzRGBAMultiThreshold(), and WlzShadeCorrectBFDF().
WlzObject* WlzIntersect3d | ( | WlzObject ** | objs, |
int | n, | ||
int | uvt, | ||
WlzErrorNum * | wlzErr | ||
) |
Calculate the intersection betweena a list of 3D objects. Should not be used directly but is intended as a static procedure called from WlzIntersectN().
objs | list of objects to be included in the intersection |
n | number of input objects |
uvt | copy grey values flag, 0 do not copy, 1 copy. |
wlzErr | error return. |
References AlcFree(), AlcMalloc(), _WlzValues::core, _WlzDomain::core, _WlzObject::domain, _WlzPlaneDomain::domains, _WlzDomain::i, _WlzGreyV::inv, _WlzPlaneDomain::lastpl, _WlzDomain::p, _WlzPlaneDomain::plane1, _WlzVoxelValues::plane1, _WlzPixelV::type, _WlzObject::type, _WlzPlaneDomain::type, _WlzPixelV::v, _WlzValues::v, _WlzObject::values, _WlzVoxelValues::values, _WlzValues::vox, _WlzPlaneDomain::voxel_size, WLZ_2D_DOMAINOBJ, WLZ_3D_DOMAINOBJ, WLZ_EMPTY_OBJ, WLZ_ERR_DOMAIN_TYPE, WLZ_ERR_MEM_ALLOC, WLZ_ERR_NONE, WLZ_ERR_OBJECT_TYPE, WLZ_GREY_INT, WLZ_PLANEDOMAIN_DOMAIN, WlzAssignDomain(), WlzAssignValues(), WlzFreeObj(), WlzIntersectN(), WlzIsEmpty(), WlzMakeEmpty(), WlzMakeMain(), WlzMakePlaneDomain(), WlzMakeVoxelValueTb(), and WlzStandardPlaneDomain().
Referenced by WlzIntersectN().
WlzObject* WlzIntersectN | ( | int | n, |
WlzObject ** | objs, | ||
int | uvt, | ||
WlzErrorNum * | dstErr | ||
) |
Calculate the intersection of a set of objects. If uvt=0 calculate domain only, uvt=1 calculate the mmean grey-value at each point. Input objects must be all non-NULL and domain objects of the same type i.e. either 2D or 3D otherwise an error is returned.
n | number of input objects |
objs | input object array |
uvt | grey-table copy flag (1 - copy, 0 - no copy) |
dstErr | error return. |
References AlcFree(), AlcFreeStackPush(), AlcMalloc(), _WlzValues::core, _WlzGreyP::dbp, _WlzGreyV::dbv, _WlzObject::domain, _WlzGreyP::flp, _WlzGreyV::flv, _WlzIntervalDomain::freeptr, _WlzDomain::i, _WlzInterval::ileft, _WlzGreyP::inp, _WlzGreyV::inv, _WlzInterval::iright, _WlzIntervalDomain::kol1, _WlzIntervalDomain::lastkl, _WlzIntervalDomain::lastln, _WlzIntervalWSpace::lftpos, _WlzIntervalDomain::line1, _WlzIntervalWSpace::linpos, _WlzIntervalWSpace::linrmn, _WlzGreyWSpace::pixeltype, _WlzGreyP::rgbp, _WlzGreyV::rgbv, _WlzIntervalWSpace::rgtpos, _WlzGreyP::shp, _WlzGreyV::shv, _WlzCoreValues::type, _WlzGreyWSpace::u_grintptr, _WlzGreyP::ubp, _WlzGreyV::ubv, _WlzValues::v, _WlzObject::values, WLZ_2D_DOMAINOBJ, WLZ_3D_DOMAINOBJ, WLZ_EMPTY_OBJ, WLZ_ERR_EOO, WLZ_ERR_GREY_TYPE, WLZ_ERR_MEM_ALLOC, WLZ_ERR_NONE, WLZ_ERR_OBJECT_NULL, WLZ_ERR_OBJECT_TYPE, WLZ_ERR_VALUES_TYPE, WLZ_GREY_DOUBLE, WLZ_GREY_FLOAT, WLZ_GREY_INT, WLZ_GREY_RGBA, WLZ_GREY_SHORT, WLZ_GREY_TAB_RAGR, WLZ_GREY_UBYTE, WLZ_INTERVALDOMAIN_INTVL, WLZ_RASTERDIR_ILIC, WlzAssignValues(), WlzFreeIntervalDomain(), WlzFreeObj(), WlzGetBackground(), WlzGreyTableIsTiled(), WlzGreyTableTypeToGreyType(), WlzGreyValueTableType(), WlzInitGreyScan(), WlzInitRasterScan(), WlzIntersect3d(), WlzIntervalCount(), WlzIsEmpty(), WlzMakeEmpty(), WlzMakeInterval(), WlzMakeIntervalDomain(), WlzMakeMain(), WlzNewValueTb(), WlzNextGreyInterval(), WlzNextInterval(), and WlzStandardIntervalDomain().
Referenced by WlzCompoundArrayToScalar(), WlzDistanceTransform(), WlzErosion(), WlzIntersect2(), WlzIntersect3d(), WlzNMSuppress(), WlzNObjGreyStats(), and WlzStructErosion().
WlzErrorNum WlzLabel | ( | WlzObject * | obj, |
int * | mm, | ||
WlzObject *** | dstArrayObjs, | ||
int | maxNumObjs, | ||
int | ignlns, | ||
WlzConnectType | connect | ||
) |
Segments a domain into connected parts. Connectivity is defined by the connect parameter and can be 4- or 8-connected for 2D objects and 6-, 18- or 26-connected for 3D objects. Note this version requires that there is sufficient space in the objects array defined by maxNumObjs and this is not extended. This should be changed in future so that the array is extended as required.
obj | Input object to be segmented. |
mm | Number of objects for return. |
dstArrayObjs | Object array for, allocated in this funtion. |
maxNumObjs | Maximum number of object to return (determines the size of the array). |
ignlns | Ignore objects with num lines <= ignlns. |
connect | Connectivity to determine connected regions. |
References WlzLAllocBuf::a_int, WlzLAllocBuf::a_link, AlcCalloc(), AlcFree(), AlcFreeStackPush(), AlcMalloc(), _WlzAllocChunk::allocsize, _WlzAllocChunk::chunk_base, _WlzDomain::core, _WlzObject::domain, _WlzIntervalDomain::freeptr, _WlzDomain::i, _WlzInterval::ileft, _WlzLLink::intv, _WlzIntervalDomain::intvlines, _WlzInterval::iright, _WlzLLink::l_link, _WlzLLink::l_u, _WlzIntervalDomain::lastln, _WlzIntervalWSpace::lftpos, _WlzLLink::line, _WlzIntervalDomain::line1, _WlzIntervalWSpace::linpos, _WlzIntervalLine::nintvs, _WlzAllocChunk::orig_base, _WlzIntervalWSpace::rgtpos, _WlzObject::type, _WlzCoreDomain::type, _WlzLLink::u_link, _WlzValues::v, _WlzObject::values, WLZ_2D_DOMAINOBJ, WLZ_3D_DOMAINOBJ, WLZ_4_CONNECTED, WLZ_8_CONNECTED, WLZ_EMPTY_OBJ, WLZ_ERR_DOMAIN_DATA, WLZ_ERR_DOMAIN_NULL, WLZ_ERR_DOMAIN_TYPE, WLZ_ERR_INT_DATA, WLZ_ERR_MEM_ALLOC, WLZ_ERR_NONE, WLZ_ERR_OBJECT_NULL, WLZ_ERR_OBJECT_TYPE, WLZ_ERR_PARAM_DATA, WLZ_ERR_UNIMPLEMENTED, WLZ_INTERVALDOMAIN_INTVL, WLZ_INTERVALDOMAIN_RECT, WLZ_RASTERDIR_ILIC, WLZ_TRANS_OBJ, WlzAssignObject(), WlzFreeIntervalDomain(), WlzFreeObj(), WlzInitRasterScan(), WlzLabel3D(), WlzMakeInterval(), WlzMakeIntervalDomain(), WlzMakeMain(), and WlzNextInterval().
Referenced by Wlz2DContains(), WlzConComThreshold(), WlzDomainFill3D(), WlzLabel3D(), WlzPolyToObj(), WlzSplitMontageObj(), WlzSplitObj(), and WlzThinToPoints().
WlzObject* WlzLabel3D | ( | WlzObject * | gObj, |
int | maxObj, | ||
int | ignLn, | ||
WlzConnectType | con, | ||
WlzErrorNum * | dstErr | ||
) |
Labels (segments) a 3D domain object into connected component objects using their connectivity.
gObj | Given object to be labeled. |
maxObj | Maximum number of objects to be found in any plane. |
ignLn | Ignore objects within a plane which have \(\geq\) the given number of lines. |
con | The connectivity to use in 3D. |
dstErr | Destination error pointer, may be NULL. |
References AlcCalloc(), AlcFree(), AlcMalloc(), AlcUFTreeFind(), AlcUFTreeFree(), AlcUFTreeNew(), AlcUFTreeUnion(), _WlzValues::core, _WlzDomain::core, _WlzObject::domain, _WlzPlaneDomain::domains, _WlzDomain::i, _WlzIntervalDomain::kol1, _WlzPlaneDomain::kol1, _WlzIntervalDomain::lastkl, _WlzPlaneDomain::lastkl, _WlzIntervalDomain::lastln, _WlzPlaneDomain::lastln, _WlzPlaneDomain::lastpl, _WlzIntervalDomain::line1, _WlzPlaneDomain::line1, _WlzCompoundArray::n, _AlcUFTree::nCmp, _WlzCompoundArray::o, _WlzDomain::p, _WlzPlaneDomain::plane1, _AlcUFTree::pr, _WlzObject::type, _WlzCoreDomain::type, _WlzCoreValues::type, _WlzObject::values, _WlzVoxelValues::values, _WlzValues::vox, _WlzPlaneDomain::voxel_size, WLZ_0_CONNECTED, WLZ_18_CONNECTED, WLZ_26_CONNECTED, WLZ_2D_DOMAINOBJ, WLZ_3D_DOMAINOBJ, WLZ_4_CONNECTED, WLZ_6_CONNECTED, WLZ_8_CONNECTED, WLZ_COMPOUND_ARR_1, WLZ_ERR_DOMAIN_DATA, WLZ_ERR_DOMAIN_NULL, WLZ_ERR_DOMAIN_TYPE, WLZ_ERR_MEM_ALLOC, WLZ_ERR_NONE, WLZ_ERR_OBJECT_NULL, WLZ_ERR_OBJECT_TYPE, WLZ_ERR_PARAM_DATA, WLZ_PLANEDOMAIN_DOMAIN, WLZ_VOXELVALUETABLE_GREY, WlzAssignDomain(), WlzAssignObject(), WlzAssignValues(), WlzDilation(), WlzFreeObj(), WlzGetBackground(), WlzHasIntersection(), WlzLabel(), WlzMakeCompoundArray(), WlzMakeMain(), WlzMakePlaneDomain(), WlzMakeVoxelValueTb(), WlzStandardPlaneDomain(), and WlzUnionN().
Referenced by WlzLabel().
WlzRCCClass WlzRegConCalcRCC | ( | WlzObject * | obj0, |
WlzObject * | obj1, | ||
int | noEnc, | ||
int | noOst, | ||
int | maxOstDist, | ||
int * | dstStatCnt, | ||
double ** | dstStatAry, | ||
WlzErrorNum * | dstErr | ||
) |
The given pair of spatial domain objects are classified using a RCC with optional enclosure and offset classifications.
For an explanation of RCC8 classifications see the type definition WlzRCCClass and the paper: D.A. Randell, etal, "Discrete Mereotopology for Spatial Reasoning in Automated Histological Image Analysis", PAMI 35(3) 2013. The RCC8 has been extended to include both tangential and non-tangential surrounds.
The RCC classification is performed using simple combinations of the Woolz union, intersection, exclusive or, dilation, fill and convex hull operators on an ordered pair of spatial domains( \(\Omega_0\) and \(\Omega_1\)):
\begin{eqnarray*} C_0 &\leftarrow& \Omega_0 \cap \Omega_1 \neq \emptyset \\ C_1 &\leftarrow& \Omega_0^+ \cap \Omega_1 \neq \emptyset \\ C_2 &\leftarrow& (\Omega_0 \oplus \Omega_1) \neq \emptyset \\ C_3 &\leftarrow& (\Omega_0 \cup \Omega_1) \oplus \Omega_1 \neq \emptyset \\ C_4 &\leftarrow& (\Omega_0^+ \cup \Omega_1) \oplus \Omega_1 \neq \emptyset \\ C_5 &\leftarrow& (\Omega_0 \cup \Omega_1) \oplus \Omega_0 \neq \emptyset \\ C_6 &\leftarrow& (\Omega_0 \cup \Omega_1^+) \oplus \Omega_0 \neq \emptyset \\ C_7 &\leftarrow& (\Omega_0^{\bullet} \cup \Omega_1) \oplus \Omega_0^{\bullet} \neq \emptyset \\ C_8 &\leftarrow& (\Omega_0 \cup \Omega_1^{\bullet}) \oplus \Omega_1^{\bullet} \neq \emptyset \\ C_9 &\leftarrow& 2|\Omega_0 \cap \Omega_1^{\circ}| \ge |\Omega_0| \\ C_{10} &\leftarrow& 2|\Omega_0^{\circ} \cap \Omega_1| \ge |\Omega_1| \end{eqnarray*}
where are the \(\cup\), \(\cap\) and \(\oplus\) are the set union (logical or), intersection (logical and) and xor (logical exclusive or) operators; \(\Omega^+\) indicates the dilation of \(\Omega\), \(\Omega^{\circ}\) the convex hull of \(\Omega\), \(\Omega^{\bullet}\) indicates \(\Omega\) filled and \(|\Omega|\) the cardinality (area or volume) of \(\Omega\). The decision tree for the classification excluding enclosure and offset is:
\[ C_0 \left\{ \begin{array}{ll} 0 & C_1 \left\{ \begin{array}{ll} 0 & C_7 \left\{ \begin{array}{ll} 0 & NTSURI \\ & \\ & \\ 1 & C_8 \left\{ \begin{array}{ll} 0 & NTSUR \\ & \\ 1 & DC \end{array} \right. \\ \end{array} \right. \\ & \\ & \\ 1 & C_7 \left\{ \begin{array}{ll} 0 & TSURI \\ & \\ & \\ 1 & C_8 \left\{ \begin{array}{ll} 0 & TSUR \\ & \\ 1 & EC \end{array} \right. \\ \end{array} \right. \\ \end{array} \right. \\ & \\ & \\ 1 & C_2 \left\{ \begin{array}{ll} 0 & EQ \\ & \\ & \\ 1 & C_3 \left\{ \begin{array}{ll} 0 & C_4 \left\{ \begin{array}{ll} 0 & NTPP \\ & \\ 1 & TPP \end{array} \right. \\ & \\ & \\ 1 & C_5 \left\{ \begin{array}{ll} 0 & C_6 \left\{ \begin{array}{ll} 0 & NTPPI \\ & \\ 1 & TPPI \end{array} \right. \\ & \\ 1 & PO \end{array} \right. \\ \end{array} \right. \\ \end{array} \right. \\ \end{array} \right. \]
The statistics are computed for each classification as below:
RCC | Normalised Volume |
\(EMPTY(\Omega_0,\Omega_1)\) | 0.0 |
\(DC(\Omega_0,\Omega_1)\) | 0.0 |
\(EC(\Omega_0,\Omega_1)\) | 0.0 |
\(EQ(\Omega_0,\Omega_1)\) | 1.0 |
\(PO(\Omega_0,\Omega_1)\) | \(|\Omega_0 \cap \Omega_1|/ |\Omega_0 \cup \Omega_1|\) |
\(TPP(\Omega_0,\Omega_1)\) | \(|\Omega_0|/|\Omega_0 \cup \Omega_1|\) |
\(NTPP(\Omega_0,\Omega_1)\) | \(|\Omega_0|/|\Omega_0 \cup \Omega_1|\) |
\(TPPI(\Omega_0,\Omega_1)\) | \(|\Omega_1|/|\Omega_0 \cup \Omega_1|\) |
\(NTPPI(\Omega_0,\Omega_1)\) | \(|\Omega_1|/|\Omega_0 \cup \Omega_1|\) |
\(TSUR(\Omega_0,\Omega_1)\) | \(|\Omega_0|/|\Omega_0 \cup \Omega_1|\) |
\(TSURI(\Omega_0,\Omega_1)\) | \(|\Omega_1|/|\Omega_0 \cup \Omega_1|\) |
\(NTSUR(\Omega_0,\Omega_1)\) | \(|\Omega_0|/|\Omega_0 \cup \Omega_1|\) |
\(NTSURI(\Omega_0,\Omega_1)\) | \(|\Omega_1|/|\Omega_0 \cup \Omega_1|\) |
\(ENC(\Omega_0,\Omega_1)\) | \(|\Omega_0 \cap \Omega_1^{\circ}|/|\Omega_0|\) |
\(ENCI(\Omega_0,\Omega_1)\) | \(|\Omega_0^{\circ} \cap \Omega_1|/|\Omega_1|\) |
\(OST(\Omega_0,\Omega_1)\) | \(q_1/(q_1 + q_2 - q_0)\) |
Many of the objects that are computed during the classification are done so using a lazy evaluation with the functions WlzRCCMakeC() and WlzRCCMakeT().
Enclosure and offset are somwhat more expensive to compute than the other classifications, for this reason and because they are not strictly part of a RCC they can be avoided by setting the noEnc or noOst flags.
Enclosure will be computed if the noEnc has not been set and the classification is not one of WLZ_RCC_EQ, WLZ_RCC_TSUR, WLZ_RCC_TSURI, WLZ_RCC_NTSUR or WLZ_RCC_NTSURI. Enclosure is computed using:
\[ |\Omega_0 \cap \Omega_1^{\circ}|/|\Omega_0| \]
for \(\Omega_0\) to be encloded by \(\Omega_1\) then at least half of \(\Omega_0\) must intersect the convex hull of \(\Omega_1\).
Offset will be computed if the noOst parameter has not been set and the classification is not WLZ_RCC_EQ. Offset is computed within a restricted domain in which all pixels/voxels are equidistant for the domains of the given objects:
\[ \Omega_e = (\Omega_0 \cup \Omega_1)^\circ \cap \Omega_0^{+d_{max}} \cap \Omega_1^{+d_{max}} \cap \Omega(D(\Omega_0) = D(\Omega_1)) \]
where \(D(\Omega)\) is the distance transform of the domain \(\Omega\). Within \(\Omega_e\) the first, second and third quantiles ( \(q_0\), \(q_1\) and \(q_2\)) of the distances \(D(\Omega_0)\) (or equivalently \(D(\Omega_1)\)) are computed. The ratio of the median to the median plus interquartile range is then computed and the domains are classified as offset if this ratio is greater than or equal to one half:
\[ \frac{q_1}{q_1 + q_2 - q_0} \geq 0.5 \]
obj0 | First given spatial domain object. |
obj1 | Second given spatial domain object. |
noEnc | Don't include enclosure if non-zero. |
noOst | Don't include offset if non-zero. |
maxOstDist | Maximum distance for offset, not used if noOst is non-zero. |
dstStatCnt | Destination pointer for the number of elements returned in the array of statistics (see above), may be NULL. Ignored if dstStatAry is NULL. |
dstStatAry | Destination pointer for an array of statistics (see above), may be NULL. If an array is returned it should be freed using AlcFree(). |
dstErr | Destination error pointer, may be NULL. |
References AlcCalloc(), AlcFree(), AlcMalloc(), _WlzValues::core, _WlzDomain::core, _WlzObject::domain, _WlzPlaneDomain::domains, _WlzGreyP::inp, _WlzGreyV::inv, _WlzPlaneDomain::lastpl, _WlzIntervalWSpace::lftpos, _WlzDomain::p, _WlzPlaneDomain::plane1, _WlzIntervalWSpace::rgtpos, _WlzPixelV::type, _WlzObject::type, _WlzGreyWSpace::u_grintptr, _WlzPixelV::v, _WlzObject::values, _WlzVoxelValues::values, _WlzValues::vox, WLZ_26_CONNECTED, WLZ_2D_DOMAINOBJ, WLZ_3D_DOMAINOBJ, WLZ_8_CONNECTED, WLZ_BO_EQ, WLZ_CLAMP, WLZ_ERR_DEGENERATE, WLZ_ERR_DOMAIN_DATA, WLZ_ERR_DOMAIN_NULL, WLZ_ERR_EOO, WLZ_ERR_MEM_ALLOC, WLZ_ERR_NONE, WLZ_ERR_OBJECT_TYPE, WLZ_ERR_PARAM_DATA, WLZ_GREY_INT, WLZ_OCTAGONAL_DISTANCE, WLZ_RCC_DC, WLZ_RCC_EC, WLZ_RCC_EMPTY, WLZ_RCC_ENC, WLZ_RCC_ENCI, WLZ_RCC_EQ, WLZ_RCC_NTPP, WLZ_RCC_NTPPI, WLZ_RCC_NTSUR, WLZ_RCC_NTSURI, WLZ_RCC_OST, WLZ_RCC_PO, WLZ_RCC_TPP, WLZ_RCC_TPPI, WLZ_RCC_TSUR, WLZ_RCC_TSURI, WLZ_RCCIDX_CNT, WLZ_RCCIDX_OST, WLZ_THRESH_HIGH, WLZ_THRESH_LOW, WlzAssignObject(), WlzConvexHullToObj(), WlzDilation(), WlzDistanceTransform(), WlzDomainFill(), WlzFreeObj(), WlzGreyTemplate(), WlzImageArithmetic(), WlzInitGreyScan(), WlzIntersect2(), WlzIsEmpty(), WlzMakeMain(), WlzMakeSphereObject(), WlzNextGreyInterval(), WlzObjToConvexHull(), WlzSetBackground(), WlzStructDilation(), WlzThreshold(), WlzUnion2(), WlzVolume(), and WlzXORDom().
WlzErrorNum WlzSplitObj | ( | WlzObject * | refObj, |
WlzObject * | ppObj, | ||
int | bWidth, | ||
double | bgdFrac, | ||
double | sigma, | ||
WlzCompThreshType | compThrMethod, | ||
int | nReqComp, | ||
int * | dstNComp, | ||
WlzObject *** | dstComp | ||
) |
Splits the reference object into component objects cliped from the reference object, with the bounding box of each of the component objects determined using the pre-processed object. The component objects are returned in size order.
refObj | Reference object. |
ppObj | Pre-processed object which is normalised to values in the range 0 - 255 as WlzUByte greys. |
bWidth | Border width. |
bgdFrac | Minimum fraction of values which are background values, with range [0.0+ - 1.0-]. |
sigma | Histogram smoothing parameter used by WlzHistogramCnvGauss(). |
compThrMethod | Method for computing threshold, used in call to WlzCompThresholdVT(). |
nReqComp | Number of required components. |
dstNComp | Destination pointer for the number of components extracted, must not be NULL. |
dstComp | Destination pointer for the extracted components, must not be NULL. |
References AlcCalloc(), AlcFree(), AlcMalloc(), AlgQSort(), _WlzSplitObjData::compI, _WlzValues::core, _WlzDomain::core, _WlzObject::domain, _WlzBox::i2, _WlzBox::i3, _WlzSplitObjData::lComp, _WlzSplitObjData::lCompSz, _WlzSplitObjData::nLComp, _WlzObject::type, _WlzObject::values, WLZ_0_CONNECTED, WLZ_26_CONNECTED, WLZ_2D_DOMAINOBJ, WLZ_3D_DOMAINOBJ, WLZ_8_CONNECTED, WLZ_ERR_DOMAIN_NULL, WLZ_ERR_MEM_ALLOC, WLZ_ERR_NONE, WLZ_ERR_OBJECT_NULL, WLZ_ERR_OBJECT_TYPE, WLZ_ERR_PARAM_DATA, WLZ_ERR_PARAM_NULL, WLZ_ERR_VALUES_NULL, WlzArea(), WlzAssignObject(), WlzBoundingBox2I(), WlzBoundingBox3I(), WlzClipObjToBox2D(), WlzClipObjToBox3D(), WlzCompThresholdVT(), WlzFreeObj(), WlzHistogramCnvGauss(), WlzHistogramObj(), WlzLabel(), WlzThreshold(), WlzVolume(), _WlzIBox2::xMax, _WlzIBox3::xMax, _WlzIBox2::xMin, _WlzIBox3::xMin, _WlzIBox2::yMax, _WlzIBox3::yMax, _WlzIBox2::yMin, _WlzIBox3::yMin, _WlzIBox3::zMax, and _WlzIBox3::zMin.
WlzErrorNum WlzSplitMontageObj | ( | WlzObject * | mObj, |
WlzPixelV | gapV, | ||
double | tol, | ||
int | bWidth, | ||
WlzLong | minArea, | ||
int | maxComp, | ||
int * | dstNComp, | ||
WlzObject *** | dstComp | ||
) |
Splits the given montage object into component objects clipped from the montage object. The montage object must be composed of component images embedded in a background, with little variation in the background values.
mObj | Montage object, which must be either a WLZ_2D_DOMAINOBJ or a WLZ_3D_DOMAINOBJ with values. |
gapV | Value for the uniform background. Must be either WLZ_GREY_INT or WLZ_GREY_RGBA. |
tol | Tolerance (fraction) for the variation in background values. |
bWidth | Additional boundary width added to detected images before they are clipped. |
minArea | Minimum area for a valid component image, must be greater than zero. |
maxComp | Maximum number of components. |
dstNComp | Destination pointer for the number of components extracted, must not be NULL. |
dstComp | Destination pointer for the extracted components, must not be NULL. |
References _WlzBox::i2, _WlzBox::i3, _WlzGreyV::inv, _WlzSplitObjData::lComp, _WlzSplitObjData::nLComp, _WlzGreyV::rgbv, _WlzPixelV::type, _WlzObject::type, _WlzPixelV::v, WLZ_2D_DOMAINOBJ, WLZ_3D_DOMAINOBJ, WLZ_4_CONNECTED, WLZ_6_CONNECTED, WLZ_CLAMP, WLZ_ERR_GREY_TYPE, WLZ_ERR_NONE, WLZ_ERR_OBJECT_NULL, WLZ_ERR_OBJECT_TYPE, WLZ_ERR_PARAM_DATA, WLZ_GREY_INT, WLZ_GREY_RGBA, WLZ_RGBA_BLUE_GET, WLZ_RGBA_GREEN_GET, WLZ_RGBA_RED_GET, WLZ_RGBA_RGBA_SET, WLZ_THRESH_HIGH, WLZ_THRESH_LOW, WlzArea(), WlzBoundingBox2I(), WlzBoundingBox3I(), WlzClipObjToBox2D(), WlzClipObjToBox3D(), WlzDiffDomain(), WlzFreeObj(), WlzGreyTypeFromObj(), WlzLabel(), WlzRGBABoxThreshold(), WlzThreshold(), WlzValueConvertPixel(), WlzVolume(), _WlzIBox2::xMax, _WlzIBox3::xMax, _WlzIBox2::xMin, _WlzIBox3::xMin, _WlzIBox2::yMax, _WlzIBox3::yMax, _WlzIBox2::yMin, _WlzIBox3::yMin, _WlzIBox3::zMax, and _WlzIBox3::zMin.
WlzObject* WlzUnion2 | ( | WlzObject * | obj1, |
WlzObject * | obj2, | ||
WlzErrorNum * | dstErr | ||
) |
Convenience procedure to calculate the union of two woolz domain objects. This calls WlzUnnionN() with uvt=0. Objects must be of the same type.
obj1 | First inout object. |
obj2 | Second input object. |
dstErr | errro return. |
References WlzUnionN().
Referenced by WlzBoundToObj(), WlzBuildObj3(), WlzCCorS2D(), WlzConComThreshold(), WlzDomainFill3D(), WlzDomainNearby(), WlzDrawDomainObj(), WlzFillBlankPlanes(), WlzHyThreshold(), WlzMakeMarkers(), WlzPointsToDomObj(), WlzProj3DToSection(), WlzRegConCalcRCC(), WlzRGBAMultiThreshold(), and WlzXORDom().
WlzObject* WlzUnion3d | ( | int | n, |
WlzObject ** | objs, | ||
int | uvt, | ||
WlzErrorNum * | dstErr | ||
) |
Private routine used by WlzUnionN() for 3D objects.
n | number of input objects |
objs | object array |
uvt | grey-table copy flag |
dstErr | error return |
References AlcFree(), AlcMalloc(), _WlzValues::core, _WlzObject::domain, _WlzPlaneDomain::domains, _WlzDomain::i, _WlzPlaneDomain::lastpl, _WlzDomain::p, _WlzPlaneDomain::plane1, _WlzVoxelValues::plane1, _WlzObject::type, _WlzPlaneDomain::type, _WlzCoreValues::type, _WlzKrigModelFn::type, _WlzValues::v, _WlzObject::values, _WlzVoxelValues::values, _WlzValues::vox, _WlzPlaneDomain::voxel_size, WLZ_2D_DOMAINOBJ, WLZ_3D_DOMAINOBJ, WLZ_ERR_DOMAIN_TYPE, WLZ_ERR_MEM_ALLOC, WLZ_ERR_NONE, WLZ_ERR_VALUES_TYPE, WLZ_PLANEDOMAIN_DOMAIN, WLZ_VOXELVALUETABLE_GREY, WlzAssignDomain(), WlzAssignValues(), WlzCopyDomain(), WlzCopyValues(), WlzFreeObj(), WlzMakeMain(), WlzMakePlaneDomain(), WlzMakeVoxelValueTb(), WlzStandardPlaneDomain(), and WlzUnionN().
Referenced by WlzUnionN().
WlzObject* WlzUnionN | ( | int | n, |
WlzObject ** | objs, | ||
int | uvt, | ||
WlzErrorNum * | dstErr | ||
) |
Calculate the set union of an array of domain objects. Domians only unless uvt non-zero in which case make an average grey table. Note background values are used in the averaging process. All objects must be domain objects of the same type (2D or 3D) unless WLZ_EMPTY_OBJ, NULL input objects are an error.
This function may modify the order of the objects in the array it is passed if the array contains empty objects.
n | number of input objects |
objs | input object array |
uvt | grey-table copy flag, copy if non-zero. |
dstErr | error return. |
References AlcFree(), AlcFreeStackPush(), AlcMalloc(), _WlzValues::core, _WlzGreyP::dbp, _WlzGreyV::dbv, _WlzObject::domain, _WlzGreyP::flp, _WlzGreyV::flv, _WlzIntervalDomain::freeptr, _WlzDomain::i, _WlzInterval::ileft, _WlzGreyP::inp, _WlzGreyV::inv, _WlzInterval::iright, _WlzIntervalDomain::kol1, _WlzIntervalDomain::lastkl, _WlzIntervalDomain::lastln, _WlzIntervalWSpace::lftpos, _WlzIntervalDomain::line1, _WlzIntervalWSpace::linpos, _WlzIntervalWSpace::linrmn, _WlzGreyWSpace::pixeltype, _WlzGreyP::rgbp, _WlzGreyV::rgbv, _WlzIntervalWSpace::rgtpos, _WlzGreyP::shp, _WlzGreyV::shv, _WlzCoreValues::type, _WlzKrigModelFn::type, _WlzGreyWSpace::u_grintptr, _WlzGreyP::ubp, _WlzValues::v, _WlzObject::values, WLZ_2D_DOMAINOBJ, WLZ_3D_DOMAINOBJ, WLZ_EMPTY_OBJ, WLZ_ERR_GREY_TYPE, WLZ_ERR_MEM_ALLOC, WLZ_ERR_NONE, WLZ_ERR_OBJECT_NULL, WLZ_ERR_OBJECT_TYPE, WLZ_ERR_PARAM_DATA, WLZ_ERR_VALUES_TYPE, WLZ_GREY_DOUBLE, WLZ_GREY_FLOAT, WLZ_GREY_INT, WLZ_GREY_RGBA, WLZ_GREY_SHORT, WLZ_GREY_TAB_RAGR, WLZ_GREY_UBYTE, WLZ_INTERVALDOMAIN_INTVL, WLZ_RASTERDIR_ILIC, WLZ_TRANS_OBJ, WlzAssignValues(), WlzFreeIntervalDomain(), WlzFreeObj(), WlzGetBackground(), WlzGreyTableIsTiled(), WlzGreyTableTypeToGreyType(), WlzGreyValueTableType(), WlzInitGreyScan(), WlzInitRasterScan(), WlzIntervalCount(), WlzIsEmpty(), WlzMakeEmpty(), WlzMakeInterval(), WlzMakeIntervalDomain(), WlzMakeMain(), WlzNewValueTb(), WlzNextGreyInterval(), WlzNextInterval(), and WlzUnion3d().
Referenced by Wlz3DSectionOcc(), WlzCompoundToRGBA(), WlzDilation(), WlzDomainFill3D(), WlzDomainNearby(), WlzDomainOccupancy(), WlzIndexObjFromCompound(), WlzLabel3D(), WlzOffsetDist(), WlzPatchTreeToObject(), WlzPolyToObj(), WlzRegisterPatchTreeBF(), WlzStructDilation(), WlzUnion2(), and WlzUnion3d().