Skip to content

lines_facetLinesFacetLinesFacetlines_facetlines_facetπŸ”—

Short descriptionπŸ”—

lines_facetLinesFacetLinesFacetlines_facetlines_facet β€” Detection of lines using the facet model.

SignatureπŸ”—

lines_facet( image Image, out xld_cont Lines, integer MaskSize, number Low, number High, string LightDark )void LinesFacet( const HObject& Image, HObject* Lines, const HTuple& MaskSize, const HTuple& Low, const HTuple& High, const HTuple& LightDark )static void HOperatorSet.LinesFacet( HObject image, out HObject lines, HTuple maskSize, HTuple low, HTuple high, HTuple lightDark )def lines_facet( image: HObject, mask_size: int, low: Union[float, int], high: Union[float, int], light_dark: str ) -> HObject

Herror lines_facet( const Hobject Image, Hobject* Lines, const Hlong MaskSize, double Low, double High, const char* LightDark )

Herror T_lines_facet( const Hobject Image, Hobject* Lines, const Htuple MaskSize, const Htuple Low, const Htuple High, const Htuple LightDark )

HXLDCont HImage::LinesFacet( Hlong MaskSize, const HTuple& Low, const HTuple& High, const HString& LightDark ) const

HXLDCont HImage::LinesFacet( Hlong MaskSize, double Low, double High, const HString& LightDark ) const

HXLDCont HImage::LinesFacet( Hlong MaskSize, double Low, double High, const char* LightDark ) const

HXLDCont HImage::LinesFacet( Hlong MaskSize, double Low, double High, const wchar_t* LightDark ) const (Windows only)

HXLDCont HImage.LinesFacet( int maskSize, HTuple low, HTuple high, string lightDark )

HXLDCont HImage.LinesFacet( int maskSize, double low, double high, string lightDark )

DescriptionπŸ”—

The operator lines_facetLinesFacet can be used to extract lines (curvilinear structures) from the image Imageimageimage. The extracted lines are returned in Lineslineslines as subpixel precise XLD-contours. The parameter LightDarklightDarklight_dark determines, whether bright or dark lines are extracted.

The extraction is done by using the facet model, i.e., a least squares fit, to determine the parameters of a quadratic polynomial in x and y for each point of the image. The parameter MaskSizemaskSizemask_size determines the size of the window used for the least squares fit. Larger values of MaskSizemaskSizemask_size lead to a larger smoothing of the image, but can lead to worse localization of the line. The parameters of the polynomial are used to calculate the line direction for each pixel. Pixels which exhibit a local maximum in the second directional derivative perpendicular to the line direction are marked as line points. The line points found in this manner are then linked to contours. This is done by immediately accepting line points that have a second derivative larger than Highhighhigh. Points that have a second derivative smaller than Lowlowlow are rejected. All other line points are accepted if they are connected to accepted points by a connected path. This is similar to a hysteresis threshold operation with infinite path length (see hysteresis_thresholdHysteresisThreshold). However, this function is not used internally since it does not allow the extraction of subpixel precise contours.

The gist of how to select the thresholds in the description of lines_gaussLinesGauss also holds for this operator. A value of Sigma = 1.5 there roughly corresponds to a MaskSizemaskSizemask_size of 5 here.

The extracted lines are returned in a topologically sound data structure in Lineslineslines. This means that lines are correctly split at junction points.

lines_facetLinesFacet defines the following attributes for each line point:

  • 'angle'"angle": The angle of the direction perpendicular to the line

  • 'response'"response": The magnitude of the second derivative

Use get_contour_attrib_xldGetContourAttribXld to obtain attribute values. See the operator reference of get_contour_attrib_xldGetContourAttribXld for further information about contour attributes.

AttentionπŸ”—

The smaller the filter size MaskSizemaskSizemask_size is chosen, the more short, fragmented lines will be extracted. This can lead to considerably longer execution times.

Note that filter operators may return unexpected results if an image with a reduced domain is used as input. Please refer to the chapter Filters.

Execution informationπŸ”—

Execution information
  • Multithreading type: reentrant (runs in parallel with non-exclusive operators).

  • Multithreading scope: global (may be called from any thread).

  • Automatically parallelized on internal data level.

ParametersπŸ”—

Imageimageimage (input_object) singlechannelimage β†’ object (byte / int1 / int2 / uint2 / int4 / real)HObject (byte / int1 / int2 / uint2 / int4 / real)HImage (byte / int1 / int2 / uint2 / int4 / real)HObject (byte / int1 / int2 / uint2 / int4 / real)Hobject (byte / int1 / int2 / uint2 / int4 / real)

Input image.

Lineslineslines (output_object) xld_cont-array β†’ objectHObjectHXLDContHObjectHobject *

Extracted lines.

MaskSizemaskSizemask_size (input_control) integer β†’ (integer)HTuple (Hlong)HTuple (int / long)intHtuple (Hlong)

Size of the facet model mask.

Default: 55
List of values: 3, 5, 7, 9, 113, 5, 7, 9, 11

Lowlowlow (input_control) number β†’ (real / integer)HTuple (double / Hlong)HTuple (double / int / long)Union[float, int]Htuple (double / Hlong)

Lower threshold for the hysteresis threshold operation.

Default: 33
Suggested values: 0, 0.5, 1, 2, 3, 4, 5, 8, 100, 0.5, 1, 2, 3, 4, 5, 8, 10
Value range: 0 ≀ Low
Recommended increment: 0.5

Highhighhigh (input_control) number β†’ (real / integer)HTuple (double / Hlong)HTuple (double / int / long)Union[float, int]Htuple (double / Hlong)

Upper threshold for the hysteresis threshold operation.

Default: 88
Suggested values: 0, 0.5, 1, 2, 3, 4, 5, 8, 10, 12, 15, 18, 20, 250, 0.5, 1, 2, 3, 4, 5, 8, 10, 12, 15, 18, 20, 25
Value range: 0 ≀ High
Recommended increment: 0.5
Restriction: High >= Low

LightDarklightDarklight_dark (input_control) string β†’ (string)HTuple (HString)HTuple (string)strHtuple (char*)

Extract bright or dark lines.

Default: 'light'"light"
List of values: 'dark', 'light'"dark", "light"

ExampleπŸ”—

(HDevelop)

* Detection of lines in an aerial image
read_image(Image,'mreut4_3')
lines_facet(Image,Lines,5,3,8,'light')
dev_display(Lines)
(C)
/* Detection of lines in an aerial image */
read_image(&Image,"mreut4_3")\;
lines_facet(Image:&Lines:5,3,8,"light")\;
disp_xld(Lines,WindowHandle)\;
(C++)
/* Detection of lines in an aerial image */
HWindow w(0,0,520,560)\;
HImage Image("mreut4_3")\;
HXLDContArray Lines = Image.LinesFacet(5,3,8,"light")\;
Lines.Display(w)\;

ComplexityπŸ”—

Let \(A\) be the number of pixels in the domain of Imageimageimage. Then the runtime complexity is \(O(A*\textrm{MaskSize})\).

The amount of temporary memory required is dependent on the height \(H\) of the domain of Imageimageimage and the width \(W\) of Imageimageimage. Let \(S = W*H\), then lines_facetLinesFacet requires at least \(55*S\) bytes of temporary memory during execution.

ResultπŸ”—

lines_facetLinesFacet returns 2 (H_MSG_TRUE) if all parameters are correct and no error occurs during execution. If the input is empty the behavior can be set via set_system(::'no_object_result',<Result>:). If necessary, an exception is raised.

Combinations with other operatorsπŸ”—

Combinations

Possible successors

gen_polygons_xldGenPolygonsXld

Alternatives

lines_gaussLinesGauss

See also

bandpass_imageBandpassImage, dyn_thresholdDynThreshold, topographic_sketchTopographicSketch

ReferencesπŸ”—

A. Busch: β€œFast Recognition of Lines in Digital Images Without User-Supplied Parameters”. In H. Ebner, C. Heipke, K.Eder, eds., β€œSpatial Information from Digital Photogrammetry and Computer Vision”, International Archives of Photogrammetry and Remote Sensing, Vol. 30, Part 3/1, pp. 91-97, 1994.

ModuleπŸ”—

2D Metrology